是否有正确的名称可以实现?

时间:2010-05-12 16:05:44

标签: c++ templates metaprogramming

我刚刚进入微软的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
};

minmax两者的返回方式完全相同?这是否意味着如果我写makeSanwich()返回(_Ty(0))它会为我做一个三明治?如果只使用不同的函数名这个相同的代码,我们会得到不同的结果吗?

4 个答案:

答案 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>,则上述专业化将优先于一般情况。 floatchar等等有类似的专业。

只有当这些都不匹配时,才会选择一般情况。在这种情况下,编译器将尝试从_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。