我有一个模板统计类,它有范围参数。
template <typename T>
class limitStats
{
public:
limitStats(T mx, T min) :
max(mx),
min(mn),
range(mx-mn)
{;}
private:
const T max;
const T min;
const T range;
}
我想设置最大和最小允许值的默认值,但浮点和整数类型的最小值不相同。
通常我可以写
T min_val = numeric_limits<T>::isinteger ? numeric_limits<T>::min() : -numeric_limits<T>::max();
我发现我不能将它用作默认参数
limitStats(T mx = std::numeric_limts<T>::max(),
T mn = numeric_limits<T>::isinteger ? numeric_limits<T>::min() : -numeric_limits<T>::max())
有没有办法实现这样的目标?
答案 0 :(得分:3)
您可能想重新考虑您的设计。您试图对limitStats
未提供的std::numeric_limits
做什么?
不要复制std::numeric_limits
设计的不良之处。例如,std::numeric_limits<double>::min()
非常错误。最小双精度是最大双精度的加法倒数。 std::numeric_limits
滥用标记并滥用模板。在我看来,当然。
min
的想法是不正确的。考虑一下limitStats<unsigned int>
的默认值。
使用默认值时,range
对于有符号整数无效。对于无符号整数,它会复制max
,假设您使用limitStats<unsigned int>::min
修复了问题。对于浮点类型,它无效或复制max
,具体取决于limitStats<floating_point_type>::min
的含义。
允许默认值是否有意义?如果你只是不提供默认值并使默认构造函数私有/未实现,你甚至不会有这个问题。
答案 1 :(得分:2)
语法错误和拼写错误很多,很难分辨出哪些是你的问题。
numeric_limits
是一个模板,因此您可以numeric_limits<int>::is_integer
或模板类型numeric_limits<T>::max()
访问它。
答案 2 :(得分:1)
使用
boost::numeric::bounds<T>::lowest()
请参阅http://www.boost.org/doc/libs/1_33_1/libs/numeric/conversion/doc/bounds.html
答案 3 :(得分:0)
我在尝试创建DLL时尝试在Visual Studio中使用Windows下面的函数签名时遇到了同样的问题
int
GetARandomNum(
int lowest = std::numeric_limits<int>::min(),
int highest = std::numeric_limits<int>::max());
在尝试各种内容时,我决定从#inlcude <windows.h>
中移除stdafx.h
,事情开始变得很好。鉴于&#39; stdafx.h&#39;默认情况下在VS中被选中而不包括它不会对构建错误产生任何影响,我决定简单地将#inlcude <windows.h>
从stdafx'h
移动到cpp文件,只要它需要DLL项目通常只在dllmain.cpp中。我不知道为什么Windows.h
弄乱了C + 11标题,但我之前也看到了类似的问题。