模板的优化
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){
...
}
注意:
- 对于模板类,哪怕所有参数都有默认参数,在使用时也必须在后面加上
<>
来实例化。 - 对于函数模板,可以像一个普通函数一样调用,也可以加上
<>
来确定参数类型。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构