サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <iostream>
#include <string>
#include <boost/lexical_cast.hpp>
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/algorithm.hpp>
using namespace std;
// 「2倍」する
struct Double
{
template<typename T>
void operator()( T& x ) const
{
x = x + x;
}
};
// 文字列化
struct ToString
{
template<typename T>
string operator()( const T& x ) const
{
return boost::lexical_cast<string>( x );
}
template<typename T>
struct result // 返値型を「計算」するテンプレート
{
typedef string type;
};
};
int main()
{
using boost::fusion::vector;
using boost::fusion::at_c;
vector<int,string,float> t( 123, "こんにちは", 4.56 );
vector<string,string,string> s = transform( t, ToString() );
for_each( t, Double() );
cout << at_c<0>(s) << at_c<1>(s) << at_c<2>(s) << endl;
cout << at_c<0>(t) << at_c<1>(t) << at_c<2>(t) << endl;
}
123こんにちは4.55999994 246こんにちはこんにちは9.12
一言で言えば、 STLのようなアルゴリズムの適用できるタプル、 それが fusion のコンテナ (fusion::vector、fusion::list 等々) です。 boost::tuple の上位互換として使えます。
「タプルの全ての要素に関数○○を適用する」といった処理は、 一見 STL のアルゴリズムを使いたくなりますが、それはできません。 タプルのそれぞれの要素の型は違っていて、 STLのアルゴリズムは同じ型の要素を格納したコンテナに対してしか使えないからです。
タプルに対してアルゴリズムを適用するには、 要素の値を操作する「実行時」の処理と、型を操作する「コンパイル時」の処理が同時に必要となります。 そのような、STL的「実行時」処理と boost::mpl 的「コンパイル時」の 処理を融合(フュージョン!)したデータ構造&アルゴリズムのライブラリが、fusionなのです。