c++11新特性之模板的改進

C++11關於模板有一些細節的改進:c++

  • 模板的右尖括號
  • 模板的別名
  • 函數模板的默認模板參數

模板的右尖括號

C++11以前是不容許兩個右尖括號出現的,會被認爲是右移操做符,因此須要中間加個空格進行分割,避免發生編譯錯誤。編程

int main() {
    std::vector<std::vector<int>> a; // error
    std::vector<std::vector<int> > b; // ok
}複製代碼

這個我以前都不知道,我開始學編程的時候就已是C++11的時代啦。函數

模板的別名

C++11引入了using,能夠輕鬆的定義別名,而不是使用繁瑣的typedef。優化

typedef std::vector<std::vector<int>> vvi; // before c++11
using vvi = std::vector<std::vector<int>>; // c++11複製代碼

使用using明顯簡潔而且易讀,你們可能以前也見過使用typedef定義函數指針之類的操做,那爛代碼我就不列出來了,反正我是看不懂也不想看...之後均可以使用using,額仍是列出來吧。spa

typedef void (*func)(int, int); // 啥玩意,看不懂
using func = void (*)(int, int); // 起碼比typedef容易看的懂吧複製代碼

上面的代碼使用using起碼比typedef容易看的懂一些吧,可是我仍是看不懂,由於我歷來不用這種來表示函數指針,用std::function()、std::bind()、std::placeholder()、lambda表達式它不香嗎。.net

函數模板的默認模板參數

C++11以前只有類模板支持默認模板參數,函數模板是不支持默認模板參數的,C++11後都支持。指針

template <typename T, typename U=int>
class A {
      T value;  
};

template <typename T=int, typename U> // error
class A {
      T value;  
};
複製代碼

類模板的默認模板參數必須從右往左定義,而函數模板則沒有這個限制。c++11

template <typename R, typename U=int>
R func1(U val) {
    return val;
}

template <typename R=int, typename U>
R func2(U val) {
    return val;
}

int main() {
    cout << func1<int, double>(99.9) << endl; // 99
    cout << func1<double, double>(99.9) << endl; // 99.9
    cout << func1<double>(99.9) << endl; // 99.9
    cout << func1<int>(99.9) << endl; // 99
    cout << func2<int, double>(99.9) << endl; // 99
    cout << func1<double, double>(99.9) << endl; // 99.9
    cout << func2<double>(99.9) << endl; // 99.9
    cout << func2<int>(99.9) << endl; // 99
    return 0;
}複製代碼

對於函數模板,參數的填充順序是從左到右的。code

關於C++11對於模板的改進就講到這裏,請繼續關注~blog

參考資料

《深刻應用C++11:代碼優化與工程級應用》

blog.csdn.net/tennysonsky…

blog.csdn.net/wf19930209/… 更多文章,請關注個人V X 公 主 號:程序喵大人,歡迎交流。

相關文章
相關標籤/搜索