歡迎您光臨本站 註冊首頁

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

←手機掃碼閱讀     sl_ivan @ 2020-05-06 , reply:0

C++11關於模板有一些細節的改進:
模板的右尖括號
模板的別名
函數模板的默認模板參數
模板的右尖括號
C++11之前是不允許兩個右尖括號出現的,會被認為是右移操作符,所以需要中間加個空格進行分割,避免發生編譯錯誤。
int main() { std::vector<std::vector

> a; // error std::vector<std::vector> b; // ok }
這個我之前都不知道,我開始學編程的時候就已經是C++11的時代啦。
模板的別名
C++11引入了using,可以輕鬆的定義別名,而不是使用繁瑣的typedef。
typedef std::vector<std::vector> vvi; // before c++11 using vvi = std::vector<std::vector>; // 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後都支持。
templateclass A { T value; }; template// error class A { T value; };
類模板的默認模板參數必須從右往左定義,而函數模板則沒有這個限制。
templateR func1(U val) { return val; } templateR func2(U val) { return val; } int main() { cout << func1(99.9) << endl; // 99 cout << func1(99.9) << endl; // 99.9 cout << func1(99.9) << endl; // 99.9 cout << func1(99.9) << endl; // 99 cout << func2(99.9) << endl; // 99 cout << func1(99.9) << endl; // 99.9 cout << func2(99.9) << endl; // 99.9 cout << func2(99.9) << endl; // 99 return 0; }
對於函數模板,參數的填充順序是從左到右的。
關於C++11對於模板的改進就講到這裡,請繼續關注~


[sl_ivan ] 詳解c++11新特性之模板的改進已經有296次圍觀

http://coctec.com/docs/c/language/show-post-233059.html