【问题标题】:Confused about templates对模板感到困惑
【发布时间】:2014-05-07 06:51:21
【问题描述】:

我必须处理一个代码,我对此感到非常困惑。

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

这里如何使用greaterless运算符?

我不知道第二个模板是如何使用的:

template<bool b>

【问题讨论】:

  • 你到底有什么不明白的?

标签: c++ class templates


【解决方案1】:

B 是一个(嵌套的)类模板,带有bool 模板参数(b);当btrue 时,其静态成员m_n1,当bfalse0

t &gt; 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;

【讨论】:

    【解决方案2】:

    请注意,默认构造函数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。

    【讨论】:

      猜你喜欢
      • 2011-06-10
      • 2012-08-13
      • 1970-01-01
      • 2015-12-24
      • 2014-11-27
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      相关资源
      最近更新 更多