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

3

我遇到了一个可移植性问题,因为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个回答

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>
          >;

谢谢!我真的希望"if constexpr"能够处理它。我猜我需要将"std::conditional"添加到我的尴尬"ifs"集合中(和enable_if以及#ifdef一起):-) - Pascal T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接