boostのfusion編のcontainer


fusionは融合を意味し、多くのテンプレート技術を融合させ、fusionにはアダプタモジュール(adapter)、アルゴリズムモジュール(algorithm)、コンテナ(container)、関数機能(functional)、反復(iterator)、メタプログラミング(mpl)、シーケンス(sequence)、元祖(tuple)、ビュー(view)を含む多くのサブモジュールが区分されている.今日はfusionのコンテナモジュールについて簡単に述べる.fusionの容器は私たちが使っているtupleとよく似ていて、fusionの容器は反復の概念を導入しています.従って、その動作モードはSTLのvectorと非常に似ている.tupleのコアメカニズムは、TypeListの実装において既に述べていますが、そのコアはTypeListのリスト再帰特性を利用し、GenScatterHirerarchyがテンプレートのテンプレートパラメータによって生成したものであり、興味のある方は私のブログのLokiのTypeListに関する説明部分をご覧ください.ケースは以下のfusionのvectorの使用説明です.
vector<int, float> v(12, 5.5f);
std::cout << at_c<0>(v) << std::endl;
std::cout << at_c<1>(v) << std::endl;

実際のfusionの使い方はtupleとよく似ており,テンプレートパラメータで構成されたベクトルコンテナを用いてインデックス値でデータ結果を再帰する.ここでat_cこのテンプレート関数の機能は実はLokiの中のFiledの関数機能と同じで、すべて内部のテンプレートを通じてそれを強制的に変換して、vectorの形成は不規則な継承関係を通じて(通って)来たのがこのような構造体に相当するためです
struct NullType
{
};
struct s1 :public NullType
{
int m_value;
};
struct s2 : public NullType
{
  float m_value;
};
struct s :public s1, public s2
{
};
ここでsはtypedef vectorsを実行することに相当する.に表示されます.メンバー変数の名前が同じなので、値を取るときに直接取ることはできません.ベースクラスオブジェクトに変換して値を取るか、同名のものでは曖昧になります.そしてat_cの機能は,インデックスによりベースクラスのタイプを取得し,それを強制的に出力タイプに変換し,値を取り出すことである.