设为首页 加入收藏

TOP

<四>模板的完全特例化和非完全特例化(二)
2023-07-23 13:35:28 】 浏览:74
Tags:< > 全特例
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 = &sum; (*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
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇C/C++标准输入输出函数终极最全解.. 下一篇C++ 标准库 sort() / stable_sort..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目