模板的优化

发布时间 2023-12-04 17:04:15作者: Beasts777

文章参考:爱编程的大丙 (subingwen.cn)

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){
    ...
}

注意:

  • 对于模板类,哪怕所有参数都有默认参数,在使用时也必须在后面加上<>来实例化。
  • 对于函数模板,可以像一个普通函数一样调用,也可以加上<>来确定参数类型。