這篇文章主要介紹“C++模板的別名和默認參數是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C++模板的別名和默認參數是什么”文章能幫助大家解決問題。
在C++98/03的泛型編程中,模板實例化有一個很繁瑣的地方,就是連續兩個右尖括號(>>)會被編譯解釋成右移操作符,而不是模板參數表的形式,需要一個空格進行分割,以避免發生編譯時的錯誤。
template <int i> class X{};
template <class T> class Y{};
int main()
{
Y<X<1> > x1; // ok, 編譯成功
Y<X<2>> x2; // err, 編譯失敗
return 0;
};在實例化模板時會出現連續兩個右尖括號,同樣static_cast、dynamic_cast、reinterpret_cast、const_cast表達式轉換時也會遇到相同的情況。C++98標準是讓程序員在>>之間填上一個空格,在C++11中,這種限制被取消了。在C++11標準中,要求編譯器對模板的右尖括號做單獨處理,使編譯器能夠正確判斷出”>>”是一個右移操作符還是模板參數表的結束標記。
#include <iostream>
#include <type_traits> //std::is_same
using namespace std;
using uint = unsigned int;
typedef unsigned int UINT;
using sint = int;
int main()
{
//std::is_same 判斷類型是否一致
//這個結構體作用很簡單,就是兩個一樣的類型會返回true
cout << is_same<uint, UINT>::value << endl; // 1
return 0;
}C++11之前,類模板是支持默認的模板參數,卻不支持函數模板的默認模板參數:
//1、普通函數帶默認參數,c++98 編譯通過,c++11 編譯通過
void DefParm(int m = 3) {}
//2、類模板是支持默認的模板參數,c++98 編譯通過,c++11 編譯通過
template <typename T = int>
class DefClass {};
//3、函數模板的默認模板參數, c++98 - 編譯失敗,c++11 - 編譯通過
template <typename T = int> void類模板的默認模板參數必須從右往左定義,數模板的默認模板參數則沒這個限定:
template<class T1, class T2 = int> class DefClass1; template<class T1 = int, class T2> class DefClass2; // 無法通過編譯 template<class T, int i = 0> class DefClass3; template<int i = 0, class T> class DefClass4; // 無法通過編譯 template<class T1 = int, class T2> void DefFunc1(T1 a, T2 b); template<int i = 0, class T> void
關于“C++模板的別名和默認參數是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。