template<typename HELPER_>
class A{
public:
typedef HELPER_ HELPER ;
typedef typename HELPER::TRAITS_ TRAITS_2;
// other stuff....
};
我的问题是HELPER_
是一种类型,然后HELPER
也是一种类型,那么HELPER::TRAITS
_表示什么。类似地,如果HELPER
不是类的名称,则它只是指定的未知类型。但是在上面的代码中,感觉HELPER
是类的名称,并且它正在调用它的公共变量名TRAITS_
。
我想知道上面代码的含义。
答案 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