
首先,类模板定义 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17template<typename T> class MyTemplateClass{
//在类模板自己的作用域中,可以直接使用模板名字而不提供实参,实参指的是`<typename T>`这种
MyTemplateClass ret_func(const MyTemplateClass &customclass){
return customclass;
}
//当实例化是T会被输入的实参而代替
T cal_fun(T temp){
return T*T;
}
//在类外定义,类内定义的函数时默认内联的
T out_func(T temp);
};
//类外定义成员函数的写法
template<typename T>
T MyTemplateClass<T>::cal_func(T temp){
return T+T;
}1
2
3
4
5
6//注意作用域外和作用域内
template<typename T>
MyTemplateClass<T> MyTemplateClass<T>::some_func(){
MyTemplateClass ret = *this;
return ret;
}1
2
3template<typename T> class Bar{
friend T;
};Foo
成为Bar<Foo>
的友元,Foo2
成为Bar<Foo2>
的友元
定义类模板别名: 1
2template<typename T> using type_alias = Bar<T,T>
//如此一来 type_alias<string>是一个Bar<string,string>static
来说,每一个实例都有自己的static。即对于给定类型X,Foostatic std::size_t ctr
和 1
2template<typename T>
static size_t Foo<T>::ctr;
模板声明 extern template class Blob<string>
其次,函数模板定义 1
2
3
4
5template<typename T>
int compare(const &T t1,const &T t2){
if t1 < t2 : return 1;
if t1 > t2 : return -1;
}1
2
3
4template<typename T,typename... Args> //模板参数包
void fun(const T &t,const Args& ...args){ //函数参数包
//funtion
}
Forward是一个可以保持原始实参的类型,通过forward进行函数实参的调用就能很爽,std::forward