如何std::variant<unsigned long, size_t, unsigned int>

how to std::variant<unsigned long, size_t, unsigned int>

我 运行 陷入可移植性问题,这是由于 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

因为你想要一个条件类型别名,你可以使用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>
          >;