使用這個關鍵字的作用是找到某一個表達式的類型。其實是類似於typeof但是沒有typeof,其實每一個類型是有一個typeid的其實是你是可以獲得這個id並且打印出來的,但是ID打印出來也沒有什麼意義。
c++11導入了一個新的關鍵字,就是decltype
具體的使用可以看下方
當我們想要知道一個容器裏面包含了什麼類型的元素的時候我們可以使用decltype來獲取裏面的數據類型,通過對象來取得type其實就是decltype的用法和出現的意義。
map<string,float> coll;
decltype(coll)::value_type elem;
當然除了這種用法以外,還可以用來定義函數的返回類型
下面這種使我們所希望的應用方式,這個函數的返回值的類型就是decltype x+y之後結果的類型。
但是編譯是過不了的,因爲說實話編譯時從左到右的,先遇到了x與y並不知道是什麼類型的元素,所以編譯之後會報錯。那正確的使用方式是什麼呢?
template <typename T1,typename T2>
decltype(x+y)add(T1 x, T2 y);
正確的寫法
c++爲了解決上面那一種尷尬的情況出現了新的語法
template<typename T1 , typename T2>
auto add(T1 x , T2 y)->decltype(x + y);
先用一個auto類型代表我們目前不知道是什麼類型,之後在後面還需要制定decltype返回類型是什麼樣子的,新的函數類型的指定方式。
或者是這樣使用
template <typename T>
void test(T obj)
{
map<strting ,float>::value_type elem1;
map<string , float> coll;
decltype(coll):: value_type elem2;
typedef typename decltype(obj)::iterator iType;
decltype(obj) anotherObj(obj);
}
還可以作爲lambda的傳遞值
auto cmp = [](const Person& p1 , const Person& p2){
return p1.lastname() < p2.lastname()
|| (p1.lastname() == p2.lastname())
&& (p1.firstname() < p2.firstname());
}
std::set<Person,decltype(cmp)> coll(cmp);