2014-10-04 76 views
4

我有这样的代码:模板名称不带参数

template <typename A> 
class templatedclass { 
    public: 
    using type = templatedclass; 
}; 

template <typename A> 
class sinkstuff { 
    public: 
    void print() { 
     cout << "generic sinkstuff"; 
    } 
}; 
template <typename A> 
class sinkstuff <templatedclass<A>> { 
    public: 
    void print() { 
     cout << "partiallyspecialized sinkstuff"; 
    } 
}; 

template <typename NtoA> 
struct pass_parameter : sinkstuff<typename templatedclass<NtoA>::type> {}; 


int main() { 
    pass_parameter<int> obj; 
    obj.print(); 
    cout << is_same<templatedclass<int>, typename templatedclass<int>::type>::value; // 1, yes 
} 

我一直以为“用指令”是对类固醇的类型定义。如何在不指定参数的情况下使用“templatedclass<int>::type”,即“templatedclass<int>::type<int>”?

是不是“使用type = templatedclass”只是文本替换?我错过了什么吗?

+1

除了宏,没有什么是“只是文本替换”! – 2014-10-04 17:40:30

+0

相关:http://stackoverflow.com/q/25549652 – dyp 2014-10-04 17:51:39

+0

相关/重复:http://stackoverflow.com/q/8031823 – dyp 2014-10-04 17:52:11

回答

4

一个类的名字被“注入”到类中,这叫做注入类的名字。它类似于:

class my_class_name 
{ 
public: 
    typedef ::my_class_name my_class_name; 
}; 

(但这当然不能编译,一类可能不具有相同的名称作为类的手动声明的成员。)

类模板也有注入-class名,和它可以被用于指代类模板本身,或者当前的专业化(包括当前模板参数),这取决于上下文:

[temp.local]/1

赞正常(非模板)类,类模板具有注入类名称。注入的类名称可以用作模板名称类型名称。当它被用来与模板参数列表,作为模板参数为模板模板参数,或如在最终标识符阐述型说明符朋友类模板声明的它指的是类模板本身。 否则,就相当于 随后按模板参数包含在<>类模板的模板名称

2

这和using指令没有任何关系。在A<T>(和using指令在该范围内)的定义内,说A与说A<T>相同。

这是你可能会写同样的理由:

template <typename T> 
struct A 
{ 
    void foo(const A&); 
}; 

代替

template <typename T> 
struct A 
{ 
    void foo(const A<T>&); 
}; 

有关详细信息,搜索 “注入的类名”。

相关问题