boost::tuple 深入學習講解

來源:互聯網
上載者:User

#include<iostream>
#include<string>
#include<boost/tuple/tuple.hpp>
#include<boost/tuple/tuple_io.hpp>
#include <boost/tuple/tuple_comparison.hpp>

using namespace std;

int main(){
    //boost::tuple 擴充了 C++ 的資料類型 std::pair 用以儲存多個而不只是兩個值。

    //除了 boost::tuple, 這一章還涵蓋了類 boost::any 和 boost::variant 以儲存那些不確定類型的值。 其中 boost::any 類型的變數使用起來就像弱類型語言中的變數一樣靈活。 另一方面, boost::variant 類型的變數可以儲存一些預定義的資料類型, 就像我們用 union 時候一樣。
    typedef boost::tuple<std::string, std::string> person1;
    person1 p1("Boris", "Schaeling");
    cout << p1 << std::endl;
    //就像 std::pair 有輔助函數 std::make_pair() 一樣, 一個元組也可以用它的輔助函數 boost::make_tuple() 來建立。
    std::cout << boost::make_tuple("Boris", "Schaeling", 43) << std::endl;

     //一個元組也可以儲存參考型別的值。
     std::string s = "Boris";
     std::cout << boost::make_tuple(boost::ref(s), "Schaeling", 43) << std::endl;

     //因為 "Schaeling" 和 43 是按值傳遞的,所以就直接儲存在了元組中。 與他們不同的是: person 的第一個元素是一個指向 s 的引用。 Boost.Ref 中的 boost::ref() 就是用來建立這樣的引用的。 相對的, 要建立一個常量的引用的時候, 你需要使用 boost::cref() 。

     //在學習了建立元組的方法之後, 讓我們來瞭解一下訪問元組中元素的方式。 std::pair 只包含兩個元素, 故可以使用屬性 first 和 second 來訪問其中的元素。 但元組可以包含無限多個元素, 顯然, 我們需要用另一種方式來解決訪問的問題。

     typedef boost::tuple<std::string, std::string, int> person2;
     person2 p2 = boost::make_tuple("Boris", "Schaeling", 43);
     std::cout << p2.get<0>() << std::endl;
     std::cout << boost::get<0>(p2) << std::endl;

     //我們可以用兩種方式來訪問元組中的元素: 使用成員函數 get() , 或者將元組傳給一個獨立的函數 boost::get() 。 使用這兩種方式時, 元素的索引值都是通過模板參數來指定的。 例子中就分別使用了這兩種方式來訪問 p 中的第一個元素。 因此, Boris 會被輸出兩次。

     //另外, 對於索引值合法性的檢查會在編譯期執行, 故訪問非法的索引值會引起編譯期錯誤而不是運行時的錯誤。

     //對於元組中元素的修改, 你同樣可以使用 get() 和 boost::get() 函數。
     typedef boost::tuple<std::string, std::string, int> person3;
     person3 p3 = boost::make_tuple("Boris", "Schaeling", 43);
     p3.get<1>() = "Becker";
     std::cout << p3 << std::endl;

     //get() 和 boost::get() 都會返回一個引用值。 例子中修改了 lastname 之後將會輸出: (Boris Becker 43) 。

     //Boost.Tuple 除了重載了流操作運算子以外, 還為我們提供了比較子。 為了使用它們, 你必須要包含相應的標頭檔: boost/tuple/tuple_comparison.hpp 。

     typedef boost::tuple<std::string, std::string, int> person4;
     person4 p4 = boost::make_tuple("Boris", "Schaeling", 43);
     person4 p5 = boost::make_tuple("Boris", "Becker", 43);
     std::cout << (p4 != p5) << std::endl;

     //上面的例子將會輸出 1 因為兩個元組 p1 和 p2 是不同的。


}

編譯後輸出:

(Boris Schaeling)
(Boris Schaeling 43)
(Boris Schaeling 43)
Boris
Boris
(Boris Becker 43)
1


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.