2014-05-07 186 views
2

我不得不处理一个我完全困惑的代码。对模板感到困惑

#include <iostream> 

template<class T, T t = T()> 
class A 
{ 
private: 
    template<bool b> 
    class B 
    { 
    public: 
     static const int m_n = b ? 1 : 0; 
    }; 

public: 
    static const int m_value = B<(t > T())>::m_n - B<(t < T())>::m_n; 
}; 

int main() 
{ 
    std::cout << A<int, -9>::m_value 
       << A<bool, true>::m_value 
       << A<char>::m_value << std::endl; 

    return 0; 
} 

您能评论下面的行吗?

static const int m_value = B<(t > T())>::m_n - B<(t < T())>::m_n; 

如何更大运营商在这里使用?

我不能找出如何第二模板用于:

template<bool b> 
+1

你不明白什么? – juanchopanza

回答

5

B是具有bool模板参数(b)一(嵌套)类模板;其静态成员m_n1,当btrue0bfalse

t > T()测试值t(它是模板参数A)是否大于值初始化的T。由于T必须是非类型模板参数的有效类型,因此T()等于T(0),即以正确类型表示的零。

该测试的结果然后用作B的模板参数。等效代码应该是这样的:

public: 
    static const T t0 = T(); 
    static const bool b1 = t > t0; 
    static const bool b2 = t < t0; 
    static const int m_value = B<b1>::m_n - B<b2>::m_n; 
3

注意,内建类型的默认构造函数T()零初始化。所以

B<(t > T())>::m_n 

是1,如果t为正,否则为0,和

B<(t < T())>::m_n 

是1,如果是t负,否则为0。因此

B<(t > T())>::m_n - B<(t < T())>::m_n 

是1,如果t是正的,0,如果它是零,-1,如果它是负的。