编译时C ++ 11 numeric_limits<> :: max()

时间:2015-01-25 15:34:03

标签: visual-c++ c++11

当我试图在MSVC上编译时,我发现(感叹)Visual Studio Express 2013中使用的版本尚不支持constexpr函数。因此,我无法将std::numeric_limits<size_t>::max()的结果传递给模板。我可以通过将-1转换为size_t来解决这个问题,但我认为这不会是严格的可移植性,因为(如果我错了,请纠正我)这两种补充方式定义底片并不是标准化的(尚)。

这样做的推荐方法是什么?

2 个答案:

答案 0 :(得分:3)

boost integer library被移植到许多平台并具有最大常量:boost::integer_traits<size_t>::const_max

答案 1 :(得分:2)

template <class T, class Enable = std::enable_if_t<std::is_unsigned<T>::value>>
struct NumericLimits {
  static const T sk_min_ = 0;
  static const T sk_max_ = static_cast<T>(-1);
};

用作模板参数:

template <class T, T N>
class X{};

template <class T>
class Y {
  // to instantiate X here you need a templated way
  // to get the max value of `T` because you don't know
  // what `T` actually is so you can't use something like INT_MAX
  X<T, NumericLimits<T>::sk_max_> x_;
};

auto y = Y<unsigned long>{};

标准要保证无符号变量。因此,如果您想使用一般方法来获取无符号类型的最大值(包括作为模板参数),则上述代码将起作用。

对于签名类型,我不知道除了针对每种类型的专业化之外是否存在一致的方式(只有少数(charsigned charshortintlonglong long这样也是可以实现的。)(我的意思是使用INT_MAX,而不是硬编码值,因为您不知道实施)

请注意,我已使用g++c++14上对其进行测试,因此可能需要对Visual Studio进行一些调整。