请解释这个C ++模板代码的含义

时间:2012-01-09 16:11:46

标签: c++ templates

template<typename HELPER_>
class A{
     public:

        typedef HELPER_ HELPER ;
        typedef typename HELPER::TRAITS_  TRAITS_2;
     // other stuff....
};

我的问题是HELPER_是一种类型,然后HELPER也是一种类型,那么HELPER::TRAITS _表示什么。类似地,如果HELPER不是类的名称,则它只是指定的未知类型。但是在上面的代码中,感觉HELPER是类的名称,并且它正在调用它的公共变量名TRAITS_

我想知道上面代码的含义。

4 个答案:

答案 0 :(得分:1)

typedef HELPER_ HELPER ;

在类命名空间中将HELPER_别名为HELPER,因此A<B>::HELPER等同于B。它可以在模板代码中使用。

typedef typename HELPER::TRAITS_  TRAITS_2;

在类名称空间中将HELPER::TRAITS _设为TRAITS_2,因此A<B>::TRAITS_2等同于B::TRAITS_typename是必要的,因为编译器不知道HELPER::TRAITS_是没有HELPER定义的类型。

答案 1 :(得分:1)

此代码假设对于使用的任何HELPER_模板参数,HELPER_::TRAITS_存在并且是类型名称。

代码实际执行的操作:

对于类型X,此代码确定A<X>::TRAITS_2定义为与X::TRAITS_相同的类型

答案 2 :(得分:1)

该代码允许您通过使用单独的类来指定这些特征,从而在模板类中指定自定义特征。它使用typedef来帮助完成抽象。例如,您可以设置一个特征类,以便A::TRAITS_像这样int(注意所有带有尾随下划线的大写字母中的类型名称有点不常见):

class MyTraits
{
public:
    typedef int TRAITS_;
};

template<typename HELPER_>
class A{
     public:

        typedef HELPER_ HELPER ;
        typedef typename HELPER::TRAITS_  TRAITS_2;
     // other stuff....
};

// A<MyTraits>::TRAITS_2 is now `int`.

答案 3 :(得分:0)

TRAITS_HELPER_正好出现的嵌套名称。由于typename放在此嵌套名称的前面,因此预计会表示类型

示例:

#include <string>
#include <iostream>

template<class T>
struct X{
  typedef typename T::some_type some_type;
  X(some_type const& p)
    : m(p) {}

private:
  some_type m;
};

struct A{
  typedef int some_type;
};

struct B{
  typedef std::string some_type;
};

int main(){
  X<A> x1(5);
  X<B> x2("hi");
  std::cout << "X<A>::m = " << x1.m << ", X<B>::m = " << x2.m "\n";
}

输出:

  

X&lt; A&gt; :: m = 5,X&lt; B&gt; :: m = hi