参考:C++模板的偏特化与全特化
#include <iostream>
/***************************函数全特化***************************/
template<typename T1,typename T2>
void fun(T1 t1, T2 t2) {
std::cout << t1 << " " << t2 << std::endl;
}
/*
* 全特化模板函数不能再写模板类型参数,而是空的<>
* 函数不能偏特化,只能全特化
*/
template<>
void fun<int,int>(int t1, int t2) {
std::cout << t1 << "+" << t2 << std::endl;
}
/***************************函数全特化***************************/
template <typename T1,typename T2>
class A {
public:
static void print() {
T1 t1;
T2 t2;
std::cout << "原版模板类,类型为:" << typeid(t1).name() << " " << typeid(t2).name() << std::endl;
}
};
/*
* 偏特化模板类
* 给出剩余的"模板形参"<typename T2>和必要的"模板实参"<int,T2>
*/
template <typename T2>
class A<int,T2> {
public:
static void print() {
int t1;
T2 t2;
std::cout << "偏特化模板类,类型为:" << typeid(t1).name() << " " << typeid(t2).name() << std::endl;
}
};
/*
* 全特化模板类
* 给出空的"模板形参"<>和全部"模板实参"<int,float>
*/
template <>
class A<int, float> {
public:
static void print() {
int t1;
float t2;
std::cout << "全特化模板类,类型为:" << typeid(t1).name() << " " << typeid(t2).name() << std::endl;
}
};
int main()
{
fun(static_cast<float>(1), static_cast<int>(2)); // 调用原始模板函数
fun(static_cast<int>(3), static_cast <int>(4)); // 调用最匹配的全特化版本函数
A<short, float>::print();
A<int, short>::print();
A<int, float>::print();
system("pause");
}
|