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/wf19930209/… 更多文章,請關注個人V X 公 主 號:程序喵大人,歡迎交流。