boost::fusion

トップページ > 拡張データ型 >

abstract

必要なヘッダ
<boost/fusion/sequence.hpp> (データ構造),
<boost/fusion/algorithm.hpp> (アルゴリズム),
<boost/fusion/*.hpp> (その他色々)
出来ること
実行時&コンパイル時融合タプル
リファレンス
en

sample

サンプルの動作確認バージョン [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

etc

一言で言えば、 STLのようなアルゴリズムの適用できるタプル、 それが fusion のコンテナ (fusion::vector、fusion::list 等々) です。 boost::tuple の上位互換として使えます。

「タプルの全ての要素に関数○○を適用する」といった処理は、 一見 STL のアルゴリズムを使いたくなりますが、それはできません。 タプルのそれぞれの要素の型は違っていて、 STLのアルゴリズムは同じ型の要素を格納したコンテナに対してしか使えないからです。

タプルに対してアルゴリズムを適用するには、 要素の値を操作する「実行時」の処理と、型を操作する「コンパイル時」の処理が同時に必要となります。 そのような、STL的「実行時」処理と boost::mpl 的「コンパイル時」の 処理を融合(フュージョン!)したデータ構造&アルゴリズムのライブラリが、fusionなのです。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0