ame R3>
class MyVector<R1(*)(R2, R3)> {
public:
MyVector() { cout << "MyVector<R1(*)(R2, R3)>" << endl; }
};
//模板部分特例化,接收函数类型,函数有1个返回值类型是R1,2个形参类型分别是R2,R3,注意和上面区别
template<typename R1, typename R2, typename R3>
class MyVector<R1(R2, R3)> {
public:
MyVector() { cout << "MyVector<R1(R2, R3)>" << endl; }
};
int sum(int x, int y) {
return x + y;
}
int main() {
MyVector<int> v1; //缺省模板
// char * 完全特例化模板
MyVector<char *> v2;/
// 使用部分特例化 class MyVector<Ty*>
MyVector<int *> v3;
//!注意:有完全特例化版本就用完全特例化版本,没有就用部分特例化版本,再没有就使用缺省模板
//使用部分特例化 class MyVector<Ty*> , 可以接收任何指针类型,例如函数指针=>int (*)(int,int), 整形指针,范围太范了.
// 如何针对 MyVector<int (*)(int,int)> v4;写一个完全特例化版本? 写法如下
template<>
class MyVector<int(*)(int, int)> {
public:
MyVector() { cout << "int (*)(int,int )" << endl; }
};
//上面这个模板就写了特例化,专门针对函数指针类型,不接收整形指针,字符指针等其他指针,还可以进一步优化如下
// 如何针对 MyVector<int (*)(int,int)> v4;写一个部分特例化版本? 写法如下两种
// 针对函数指针的部分特例化,带1个返回值,两个参数的函数指针
// 写法1 MyVector元素是函数指针,返回类型是T,两个参数类型也是T, 提供部分特例化
template<typename T>
class MyVector<T(*)(T, T)> {
public:
MyVector() { cout << "MyVector<T(*)(T, T)>" << endl; }
};//这种写法接收函数指针,返回值类型不固定为int了,比上面更灵活了
//写法2 MyVector 元素是函数指针,返回类型是R1,两个参数类型分别是R2,R3 提供部分特例化
template<typename R1, typename R2, typename R3>
class MyVector< R1(*)(R2, R3) >
{
public:
MyVector() { cout << "MyVector<R1(*)(R2, R3)>" << endl; }
};//这种写法比上面好处是,返回值,形参可以分别不一样了,更加灵活
//元素是函数类型,将使用默认的函数模板,也可以加上如下部分特例化模板定义
MyVector<int(int, int)> v5;
template<typename R1, typename R2, typename R3>
//针对函数类型,进行部分特例化,有一个返回值,有两个形参
class MyVector<R1(R2, R3)>
{
public:
MyVector() { cout << "MyVector<R1(R2, R3)>" << endl; }
};
//关于函数类型和函数指针类型 如下
//函数指针类型
typedef int (*PFUNCTION) (int, int);
PFUNCTION pf1 = sum;
pf1(12, 13);
//函数类型
typedef int PFUNCTION2 (int, int);
PFUNCTION2 * pf2 = ∑
(*pf2)(12, 13);
system("pause");
//有完全特例化能匹配就用完全特例化版本,有部分特例化版本就用部分特例化,再没有就用缺省模板
return 0;
}
template<typename T>
void function(T _t) {
cout << typeid(T).name() << endl;
}
//上面这种写法可以,问题:typename T 这种方式范围太大了!!优化如下
template<typename R, typename R1, typename R2>
//细分到可以取出返回值类型R1,形参1类型R2,形参2类型R3 还可以继续细分 如下
void function(R1(*)(R2,R3)) {
cout << typeid(R1).name() << endl;
cout << typeid(R2).name() << endl;
cout << typeid(R3).name() << endl;
}
//效果,继续细分到可以取出返回值类型R1,哪个类类型T,形参1类型R1,形参2类型R2 Good
template<typename R, typename T, typename R1, typename R2>
void function3(R1(T::*)(R2, R3)) {
cout << typeid(T).name() << endl;
cout << typeid(R1).name() << endl;
cout << typeid(R2).name() << endl;
cout << typeid(R3).name() << endl;
}
int add(int a,int b){
return a+b;
}
class Test {
public:
int sum(int x, int y) { return x + y; }
};
int main() {
function(10);//=>模板实参推演,推演出 typeid(T).name() 为 int
function("aaa");//=>模板实参推演,推演出 t
|