2008年10月16日 星期四

練習boost--tuple

主要是參考IBM的網站上的一篇文章

#include <tuple.hpp>
#include <iostream>
#include <tuple_io.hpp>

using namespace std;
using namespace boost;

int main(void){
tuple<int,char,float> t(2,'a',0.9);
cout << t << endl;
return 0;
}

編譯的指令
g++ tuple_b.C -o tuple_b -I /usr/include/boost/tuple/

網頁提醒要注意兩件事情
  1. tuple裡面的元素不可超過10個
  2. tuple裡面的元素要有公開的copy constructor

對於第一點為何不可以超過10個我不大了然,不過第二個大概是當tuple再回傳或者當作參數的時候,預設大概都是bitwise的拷貝,所以在使用上就要考慮到copy constructor,我個人建議是tuple只用來存取一些value only的元素,不要用到pointer或者reference之類的,雖然威力上會打折扣,可是維護上相對應該輕鬆不少

在STL裡面使用make_pair,在boost裡面使用make_tuple,用法上是差不多了
至於取得裡面的元素,則是t.get<0>()或者boost::get<1>(t),紅色的部分表示tuple變數,藍色是第幾個參數

我個人認為,如果把pair跟tuple當作工具來使用,其實不大合乎概念,以STL來說,pair的出現是為了map之類的container存在的,為了對於container跟iterator所做出的抽象對應,而犧牲了可讀性的產品,如果把pair當作回傳一對數值的工具還不如把他變成struct;至於tuple存在的理由我現在還不大明瞭,有機會在慢慢研究

1 則留言:

fr3@K 提到...

> g++ tuple_b.C -o tuple_b -I /usr/include/boost/tuple/

現代標準的 library, 尤其是 C++ 的 library 大都會把自己放在 prefix + include + LIBRARY_HEADER_ROOT 之下, 而非傳統的大鍋炒, 將 (大部份) header 放在 prefix + include (通常為 /usr/include) 之下.

在 source code 中的 include 應該要加上 boost 目錄的 LIBRARY_HEADER_ROOT (boost), 如 這樣:
#include <boost/tuple.hpp>

而在 compile 的時候, 如果 LIBRARY_HEADER_ROOT 是安裝在標準的 include 目錄之下, 如 /usr/include/LIBRARY_HEADER_ROOT, 就不需要 -I.

以上為 Boost 官方以及大部份現代標準的 library 的使用方法.

> 為何不可以超過10個我不大了然

因為在沒有 Variadic Templates 的 C++98 之下, (C++0x 會有) 每多支援一個元素都要多寫 code, 以及增加 compile 所需要的時間.