boost庫: auto、any、tuple、variant

 auto

auto是C++11中的關鍵字,它能夠經過類型推導自動獲得變量或對象的類型,須要注意的是auto會忽略引用,由於引用其實就表明原對象:php

  • auto不能用於函數參數
  • auto不能用於非靜態成員變量
  • auto僅能用於推導static const的整型或者枚舉成員。 
  • auto沒法定義數組
  • auto沒法推導出模板參數
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

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

 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

  variant是一種加強的union,C/C++中union只能持有POD(普通數據類型),而不能持有如string、vector等複雜類型,boost的variant則沒有這個限制。指針

相關文章
相關標籤/搜索