对模板感到困惑

时间:2014-05-07 06:51:21

标签: c++ class templates

我必须处理一个我完全感到困惑的代码。

#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>

2 个答案:

答案 0 :(得分:5)

B是一个(嵌套的)类模板,其中包含bool模板参数(b);当m_n1时,其静态成员btrue0b时为false

t > T()测试值tA的模板参数)是否大于值初始化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;

答案 1 :(得分:3)

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

B<(t > T())>::m_n
如果t为正数,则

为1,否则为0,

B<(t < T())>::m_n
如果t为负数,则

为1,否则为0。因此

B<(t > T())>::m_n - B<(t < T())>::m_n
如果t为正,则

为1;如果为零,则为0;如果为负,则为-1。