1. 程式人生 > 程式設計 >詳解c++11新特性之模板的改進

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

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

  • 模板的右尖括號
  • 模板的別名
  • 函式模板的預設模板引數

模板的右尖括號

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,額還是列出來吧。

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

上面的程式碼使用using起碼比typedef容易看的懂一些吧,但是我還是看不懂,因為我從來不用這種來表示函式指標,用std::function()、std::bind()、std::placeholder()、lambda表示式它不香嗎。

函式模板的預設模板引數

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; 
};

類模板的預設模板引數必須從右往左定義,而函式模板則沒有這個限制。

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.9
  cout << func2<double>(99.9) << endl; // 99.9
  cout << func2<int>(99.9) << endl; // 99
  return 0;
}

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

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

參考資料

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

https://blog.csdn.net/tennysonsky/article/details/77817027

https://blog.csdn.net/wf19930209/article/details/79309881?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1

到此這篇關於c++11新特性之模板的改進的文章就介紹到這了,更多相關c++11新特性之模板的改進內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!