使用numeric_limits来默认参数值

时间:2011-07-21 11:53:47

标签: c++ templates numeric-limits

我有一个模板统计类,它有范围参数。

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())

有没有办法实现这样的目标?

4 个答案:

答案 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标题,但我之前也看到了类似的问题。