1. 连续右尖号
在C++11之前,如果模板实例化时出现了两个右尖号>>
,它会被编译成右移操作符,而不是模板参数表的结束。显然,这回导致模板实例化失败,程序无法通过编译。
C++11中改进了编译器的解析规则,即:尽可能地将多个连续的右尖号(>)解析成模板参数结束符
,从而简化我们编写模板相关的参数。
Eg:编写一个用于遍历容器的模板类。
-
代码:
#include <iostream> #include <cstring> #include <vector> using namespace std; template <typename T> class Base{ public: void traversal(T &t); }; template <typename T> void Base<T>::traversal(T &t){ auto flag = t.begin(); for(; flag != t.end(); ++flag){ cout << *flag << " "; cout << endl } } int main(void){ vector<int> v = {1,2,3,4,5,6,7}; Base<vector<int>> base; // 此处实例化如果使用C++98的标准,会出错 base.traversal(v); return 0; }
-
输出:
1 2 3 4 5 6 7
2. 默认模板参数
在C++98中,类模板可以有默认的模板参数,但是函数模板不可以。
template <typename T = int, T t = 0>
class Base{
public:
void show(T t);
};
C++11中,为函数模板提供了默认模板参数的支持。
template <typename T = int>
void func(T t){
...
}
注意:
- 对于模板类,哪怕所有参数都有默认参数,在使用时也必须在后面加上
<>
来实例化。 - 对于函数模板,可以像一个普通函数一样调用,也可以加上
<>
来确定参数类型。