std::visit 相对于 if

互联网 行业动态 更新时间:2024-06-13 00:19:06

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由于只有一种类型匹配,可能会编译为更快的代码,但应该检查ifs 版本是否优化了它的多个匹配项。

更新

正如@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

本文发布于:2023-04-20 20:27:06,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/hyzx/7ff8760574d0d36c90c4649766b74eeb.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:相对于   std   visit

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!