我刚刚进入微软的limits.h
。我试着检查max()
函数的返回类型是什么,令我惊讶的是我看到这样的东西:
// TEMPLATE CLASS numeric_limits
template<class _Ty>
class numeric_limits
: public _Num_base
{ // numeric limits for arbitrary type _Ty (say little or nothing)
public:
static _Ty (__CRTDECL min)() _THROW0()
{ // return minimum value
return (_Ty(0));
}
static _Ty (__CRTDECL max)() _THROW0()
{ // return maximum value
return (_Ty(0));//EXACTLY THE SAME WHAT IN min<<------------------
}
//... other stuff
};
min
和max
两者的返回方式完全相同?这是否意味着如果我写makeSanwich()返回(_Ty(0))它会为我做一个三明治?如果只使用不同的函数名这个相同的代码,我们会得到不同的结果吗?
答案 0 :(得分:6)
这不是相关的代码。
numeric_limits<T>
专门用于原生整数类型,专门用于 实现相关的值/逻辑。看那里。
上述代码是所有非专业类型的一揽子代码,它们确实会为min()
和max()
返回相同的值。亲自尝试一下:
struct foo {
int x;
foo(int x) : x(x) {}
};
bool operator ==(foo const& a, foo const& b) { return a.x == b.x; }
assert(std::numeric_limits<foo>::min() == std::numeric_limits<foo>::max());
......我不确定这种行为是否符合标准的要求。上面的代码同样会引发编译时错误,因为numeric_limits
尚未专门用于foo
。
答案 1 :(得分:2)
如果你做更多的观察,你可能会发现特定类型有特化,而那些特化会返回更有意义的值。
答案 2 :(得分:2)
这是通过模板专业化实现的。也许,你会在其他地方找到类似的东西:
template<>
class numeric_limits<int> : public _Num_base {
public:
static int min() {
return INT_MIN;
}
static int max() {
return INT_MAX;
}
};
如果您使用numeric_limits<int>
,则上述专业化将优先于一般情况。 float
,char
等等有类似的专业。
只有当这些都不匹配时,才会选择一般情况。在这种情况下,编译器将尝试从_Ty
常量构造类型为0
的对象。为什么那是有用的......我不知道。我宁愿有编译错误。
答案 3 :(得分:1)
您看到的是未定义类型的“通用限制”。所以它的结果无关紧要。如果你看下面,你会看到:
template<> class _CRTIMP2_PURE numeric_limits<char>
: public _Num_int_base
{ // limits for type char
public:
typedef char _Ty;
static _Ty (__CRTDECL min)() _THROW0()
{ // return minimum value
return (CHAR_MIN);
}
static _Ty (__CRTDECL max)() _THROW0()
{ // return maximum value
return (CHAR_MAX);
}
// etc.
};
这是char
类型的通用模板的特化,它提供了您需要的结果。
例如,当你写:
int iMax = std::numeric_limits<char>::max() ;
它将在编译时使用numeric_limits 的专用版本,因此,将CHAR_MAX的值放入变量iMax。