当我研究“类模板部分专业化”时,我阅读下面的代码
#include <iostream>
using namespace std;
template <typename T1, typename T2>
class stream
{
public:
void f() { cout << endl << "stream<typename T1, typename T2>::f()"; }
};
template <typename T1>
class stream<T1, int>
{
public:
void f() { cout << endl << "stream<typename T1, int>::f()"; }
};
int main()
{
stream<char, float> si ;
stream<double, int> sc ;
si.f();
sc.f();
cout << endl;
return 0 ;
}
在上面的代码中,我无法理解这一行
class stream<T1, int>
这两个参数 T1,int 是否是该类或其他构造函数的参数? 如果我们使用&lt; ...,...&gt;指定一些列表在课堂宣言期间,那是什么?怎么理解这个?
答案 0 :(得分:3)
这是“类模板部分专业化”中的“部分”,您指定了一些(但不是全部)模板参数。在main
中,stream<double, int>
匹配部分特化,因为它的第二个参数是int
。
答案 1 :(得分:1)
第一个模板采用2个泛型参数,第二个模板在指定泛型参数和int时调用。这意味着您提供了不同的实现,例如在发送特定类型的集合时的性能。
答案 2 :(得分:0)
如果您部分专门化模板,则必须传递参数。这正是这条线的作用。 stream
是一个带有两个参数的类模板。部分特化将第二个参数固定为int
,同时保留第一个变量。因此,专业化只有一个参数(仅T1
)。您必须告诉编译器哪些参数是固定的,因此您必须将类型参数传递给模板。这是在class stream<T1, int>
行中完成的。
答案 3 :(得分:0)
请参阅维基百科的以下引用
如果有人知道类模板将经常与特定数据类型一起使用,并且此数据类型允许一些优化(例如,使用整数进行位移,而不是乘以或除以2),可以通过以下方式专门化模板指定另一个相同但通过指定参数类型的类模板。当编译器看到在代码中实例化的类模板时,它通常会选择与实例化匹配的最专业的模板定义。因此,如果所有模板参数都匹配,则显式特化(指定所有模板参数的特殊化)将优先于部分特化。
因此,它是为了帮助编译器优化模板。