如何std :: variant <无符号长,size_t,无符号整数>

时间:2019-11-16 09:25:37

标签: c++ enable-if

我遇到了可移植性问题,这是由于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>;

写起来不太丑的方法是什么?

链接到编译器资源管理器片段:

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

1 个答案:

答案 0 :(得分:2)

由于需要条件类型别名,因此可以使用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>
          >;