auto是C++11中的關鍵字,它能夠經過類型推導自動獲得變量或對象的類型,須要注意的是auto會忽略引用,由於引用其實就表明原對象:php
struct Foo { auto var1_ = 0; static const auto var2_ = 0; }; test.cpp:12:15: error: non-static data member declared ‘auto’ auto var1_ = 0;
使用場景:數組
any功能與auto相似,兩者不一樣之處在於:auto是一個相似int、double、string的C++關鍵字,它不是一個類,因此沒有成員函數可調用,直接把他當作int、double、string這種關鍵字來使用。any是一個類,只能經過any_cast<>得到any的實際內部值,而不能像auto定義的對象那樣直接使用它。安全
any也能夠用來存儲任意類型元素,如int、double、string、vector或自定義類型。它可以存儲任意類型的緣由是其構造函數和賦值函數opeartor=是模板函數,能夠接收任意類型。any不是一個模板類,因此定義元素的時候沒必要使用<>,如any a = 10;
須要注意的有兩點:
在any存儲字符串的時候只能使用string,如any a = string("hello");,不能使用C風格的字符串,如:any a = "hello";
若是保存動態內存指針類型,會引發內存泄露,解決方法是使用智能指針shared_ptr來指向動態內存,如:shared_ptr<char> ptrSmart(new char[10]); any a = ptrSmart; 函數
any的出現讓C++彷彿變成了一種弱類型的動態語言。
動態語言:運行期間才作數據類型檢查的語言,即編譯的時候不知道每個變量的類型,如php、Ruby
靜態語言:編譯期間作數據類型檢查的語言,即編譯的時候就知道每個變量的類型,如C/C++、C#、JAVA
強類型:變量必定是有類型的, 且變量/對象的類型一旦肯定, 其類型再也不容許更改,如C/C++/Java/C#
弱類型: 變量的類型概念很弱或者沒有類型的概念, 不一樣變量的類型能夠更改. 如php、Ruby
類型安全:的代碼不會試圖訪問本身沒被受權的內存區域,如C/C++就不是類型安全的,兩個不一樣類型的指針之間能夠經過dynamic_cast進行轉換。優化
tuple類型相似於std::pair,pair只支持包含兩種類型的元素,tuple能夠支持包含多個不一樣類型的元素,好比將其用於多個返回值的函數的話比使用struct更方便spa
boost::tuple<int, double, string> func() { int i = 1; double d = 5.0; string s("hello"); boost::tuple<int, double, string> tupleCombin(i, d, s); return tupleCombin; }
variant是一種加強的union,C/C++中union只能持有POD(普通數據類型),而不能持有如string、vector等複雜類型,boost的variant則沒有這個限制。指針