https://www.ibm.com/docs/en/zos/2.3.0?topic=only-template-template-arguments-c
解释:
XX的主类,接受两个模板参数A和B。
XX的特化类,接受一个模板参数A,而第二个参数为string
XX<int, string> a1;
a1.sss();
第二个参数为string,则匹配到特化类。
而
XX<string, int> a2;
a2.sss();
匹配不了特化类,则直接调用主类进行实例化。
全特化:
template<>
class XX<int, string>
{
public:
int a;
string b;
void sss()
{
cout << "full class" << endl;
}
};
XX<int, string> a3;
a3.sss();
匹配到全特化的类,则输出的是:full class.
对应测试代码:
template<typename A, typename B>
class XX
{
public:
A a;
B b;
void sss()
{
cout << "primary class" << endl;
}
};
template<typename A>
class XX<A, string>
{
public:
A a;
int b;
void sss()
{
cout << "partial class" << endl;
}
};
template<>
class XX<int, int>
{
public:
int a;
string b;
void sss()
{
cout << "full class" << endl;
}
};
int main()
{
XX<int, string> a1;
a1.sss();
XX<string, int> a2;
a2.sss();
XX<int, int> a3;
a3.sss();
std::cin.get();
return 0;
}
模板模板参数:
template<typename A, typename B> //主类
class XX
{
public:
XX()
{
}
A a;
B b;
void sss()
{
cout << "primary class" << endl;
}
};
template<typename A> //部分特化类
class XX<A, string>
{
public:
XX()
{
}
A a;
int b;
void sss()
{
cout << "partial class" << endl;
}
};
template<>
class XX<int, int> //全特化类
{
public:
XX()
{
}
int a;
string b;
void sss()
{
cout << "full class" << endl;
}
};
template<template<typename, typename> class A,
typename B, typename C>
void sayHelloXX()
{
A<B, C> a; //用B和C类型,特化A,这里main中的传入的参数B和C为int,string,则匹配到部分特化类XX
}
int main()
{
sayHelloXX<XX, int, string>(); //这里调用的是:部分特化类XX
std::cin.get();
return 0;
}