4

我有一个具有范围参数的模板统计类。

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

4 回答 4

3

您可能需要重新考虑您的设计。你想用你limitStatsstd::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

允许默认值是否有意义?如果您根本不提供默认值并使默认构造函数私有/未实现,您甚至不会有这个问题。

于 2011-07-21T12:15:24.677 回答
2

有太多的语法错误和拼写错误,很难说哪一个是你的问题。

numeric_limits是一个模板,因此您可以作为numeric_limits<int>::is_integer或使用模板类型访问它numeric_limits<T>::max()

于 2011-07-21T12:04:57.053 回答
1

采用

boost::numeric::bounds<T>::lowest()

请参阅http://www.boost.org/doc/libs/1_33_1/libs/numeric/conversion/doc/bounds.html

于 2011-07-21T11:58:39.017 回答
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事情开始变得很好。鉴于在 VS 中默认选择了“stdafx.h”并且不包含它对构建错误没有任何影响,我决定简单地#inlcude <windows.h>stdafx'h需要的地方移至 cpp 文件,如果是 DLL 项目通常在仅 dllmain.cpp。我不知道为什么Windows.h会弄乱 C+11 标头,但我之前也看到过类似的问题。

于 2015-04-19T20:28:36.890 回答