#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