pas*_*ugh 8
使用我没有看到的 std::visit 是否还有其他优势?
是的。您可以使用std::visit
内置函数重载解析,而不是手动匹配所有类型:
template<typename... Fs> struct Overload: Fs... { using Fs::operator()...; };
template<typename... Fs> Overload(Fs...) -> Overload<Fs...>;
static_assert(visit(Overload{
[](int) { return "int"; },
[](std::string_view) { return "string_view"; },
[](auto) { return "something else"; }
}, std::variant<int, std::string_view, bool, double>{42}) == "int"sv);
此外,visit
由于只有一种类型匹配,可能会编译为更快的代码,但应该检查if
s 版本是否优化了它的多个匹配项。
更新
正如@Quentin 在评论中提到的,
与手动 if 梯子不同,重载不会在完全匹配时被选择,而仅在可调用时才会被选择(如果需要,通过转换)
如果存在不需要转换的重载,则此技术应该会有所帮助:
[](std::same_as<int> auto) {} // C++20
或者
template<typename T, typename U> using SameAs = std::enable_if_t<std::is_same_v<T, U>>;
[](auto t, SameAs<decltype(t), int>* = 0) {} // C++17
更多推荐
相对于,std,visit
发布评论