当我试图在MSVC上编译时,我发现(感叹)Visual Studio Express 2013中使用的版本尚不支持constexpr
函数。因此,我无法将std::numeric_limits<size_t>::max()
的结果传递给模板。我可以通过将-1转换为size_t
来解决这个问题,但我认为这不会是严格的可移植性,因为(如果我错了,请纠正我)这两种补充方式定义底片并不是标准化的(尚)。
这样做的推荐方法是什么?
答案 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>{};
标准要保证无符号变量。因此,如果您想使用一般方法来获取无符号类型的最大值(包括作为模板参数),则上述代码将起作用。
对于签名类型,我不知道除了针对每种类型的专业化之外是否存在一致的方式(只有少数(char
,signed char
,short
, int
,long
,long long
这样也是可以实现的。)(我的意思是使用INT_MAX
,而不是硬编码值,因为您不知道实施)
请注意,我已使用g++
在c++14
上对其进行测试,因此可能需要对Visual Studio进行一些调整。