介绍
模板特例化实例1
template<typename T>
class Vector
{
public:
Vector() { cout << "call Vector template init" << endl; }
};
// 对char * 提供完全特例化版本
template<>
class Vector<char*>
{
public:
Vector() { cout << "call Vector<char*> init" << endl; }
};
// 对【指针类型】提供的部分特例化版本
template<typename Ty>
class Vector<Ty*>
{
public:
Vector() { cout << "call Vector<Ty*> init" << endl; }
};
// 对一个函数指针(指向一个有两个返回值的函数)提供部分特例化
template<typename R, typename A1, typename A2>
class Vector<R(*)(A1, A2)>
{
public:
Vector() { cout << "call Vector<R(*)(A1, A2)> init" << endl; }
};
// 对一个有 两个返回值的函数 提供部分特例化
template<typename R, typename A1, typename A2>
class Vector<R(A1, A2)>
{
public:
Vector() { cout << "call Vector<R(A1, A2)> init" << endl; }
};
int sum(int a, int b) { return a + b; }
int main()
{
// 会默认使用最接近的特例化
Vector<int> vec1;
Vector<char*> vec2;
Vector<int*> vec3;
Vector<int(*)(int, int)> vec4;
Vector<int(int, int)> vec5;
// PFUNC1函数指针类型
typedef int(*PFUNC1)(int, int);
PFUNC1 pfunc1 = sum;
cout << pfunc1(20, 21) << endl;
// PFUNC2函数类型
typedef int PFUNC2(int, int);
PFUNC2 *pfunc2 = sum; // 函数名就是函数指针
cout << pfunc2(20, 21) << endl;
return 0;
}
模板特例化实例2
int sum(int a, int b) { return a + b; }
template<typename T>
void func(T a)
{
// 查看类型
cout << typeid(T).name() << endl;
}
// 部分特例化
template<typename R, typename A1, typename A2>
void func2(R (*a)(A1, A2))
{
cout << typeid(R).name() << endl;
cout << typeid(A1).name() << endl;
cout << typeid(A2).name() << endl;
}
class Test
{
public:
int sum(int a, int b) { return a + b; }
};
// 对成员函数指针进行部分特化
template<typename R, typename T, typename A1, typename A2>
void func3(R(T::*a)(A1, A2))
{
cout << typeid(R).name() << endl;
cout << typeid(T).name() << endl;
cout << typeid(A1).name() << endl;
cout << typeid(A2).name() << endl;
}
int main()
{
func(10); // int
func("sdk"); // const char *
func(sum); // int(*)(int, int)
func2(sum); // int int int
func3(&Test::sum); // int class Test int int
return 0;
}