【问题标题】:how to std::variant<unsigned long, size_t, unsigned int>如何 std::variant<unsigned long, size_t, unsigned int>
【发布时间】:2019-11-16 09:25:37
【问题描述】:

我遇到了可移植性问题,这是因为size_t 在平台之间有所不同(有时它等同于unsigned int,有时等同于unsigned long

我想写的是:


"if constexpr" / "enable_if" / "whatever"  (size_t == unsigned long)
  using V = std::variant<unsigned int, size_t>;
else
  using V = std::variant<unsigned long, size_t>;

有什么不那么丑的写法?

编译器资源管理器 sn-p 的链接:

https://godbolt.org/z/AZVFEz : 使用 gcc 9.2 64 位 size_t unsigned long

https://godbolt.org/z/wWeCbW :使用 msvc 19.22 32 位 size_t unsigned int

【问题讨论】:

    标签: c++ enable-if


    【解决方案1】:

    既然你想要一个条件类型别名,你可以使用std::conditional

    using V = std::conditional_t<std::is_same_v<std::size_t, unsigned long>,
                std::variant<unsigned int, size_t>,
                std::variant<unsigned long, size_t>
              >;
    

    【讨论】:

    • 谢谢!我真的希望“如果 constexpr”能够处理它。我想我需要在我尴尬的“ifs”集合中添加“std::conditional”(连同 enable_if 和#ifdef):-)
    猜你喜欢
    • 2016-07-29
    • 2010-09-13
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多