首页 > 代码库 > C++模版
C++模版
模版分类
模板分为类模板与函数模板
函数模版:为函数写一个模版,在使用函数时需要指出类型.Template <class(或typename) T> 返回值类型函数名(形参表){.... }
类模版:为类写一个模版,在使用类时需要指出类型.
Template <class(或typename) T> class 类名{.... }
类模版内函数类外实现:
在类模板外部定义成员函数,template<模板形参列表> 函数反回类型类名<模板形参名>::函数名(参数列表){函数体}template <class T,class N> void test<T,N>::print() { 函数体; }
模版形参的类型与非类型
类型形参:模版的参数是一个类型,比如string,int等
非类型形参:模版参数是一个常整形,或者指向外部链接对象的指针.
特化与偏特化
模板特化:为模板中的所有模板参数设定一个具体的类型.
模板偏特化:为模板中的部分模板参数设定一具体的类型,而其余的模板参数仍然使用原来的参数定义.
函数模版:
#include <iostream> using namespace std; //普通函数模版 template <class T,class N> void fun(T a,N b) { cout<<"函数模版"<<endl; } //函数模版特化非类型形参 template <int a> void fun(int b,int c) { cout<<"非类型形参"<<endl; } //函数模版特化 template <> void fun(string a,int b) { cout<<"模版特化"<<endl; } int main() { fun<string,string>("sky","sky");//调用普通函数模版 fun<string,int>("sky",0);//调用模版特化 fun<5>(0,0);//调用非类型形参模版 return 0; }
类模版:
#include <iostream> using namespace std; //普通模版类 template <class T,class N> class test { public: void print(); }; //函数类外实现 template <class T,class N> void test<T,N>::print() { cout<<"普通模版类"<<endl; } //模版特化,<>表示这是一个模板类,同时在类名后加上特化的类型 template <> class test<int,int> { public: void print() { cout<<"模版特化"<<endl; } }; //模版偏特化,在类名后加上特化的类型以及模板类型 template <class T> class test<T,int> { public: void print() { cout<<"模版偏特化"<<endl; } }; int main() { test<string,string> a; a.print(); test<int,int> b; b.print(); test<string,int> c; c.print(); return 0; }
注意:
1. 函数模版没有偏特化
2. 不能为同一个模板类型形参指定两种不同的类型3. 对于模板函数,如果类型参数可以推导,那么可以省略类型参数表
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。