0

私はブーストフュージョンとmplライブラリをいじり始め、非常に単純な問題で立ち往生しました。

私は次のタイプを宣言しました:

typedef boost::mpl::vector<char, int, long>   TypeVector;
typedef boost::fusion::vector<char, int, long> FusionVector_t;

ここで、FusionVectorから値を取得する関数を作成したいと思いました。

template<size_t N typename T>
T getValue(FusionVector_t fvec)
{
    return boost::fusion::at_c<N>(fvec);
}

関数は期待どおりに機能しますが、boost :: mplベクトルからインデックスを取得してこの関数で使用し、テンプレートパラメーターとして関数に渡さないようにします。しかし、私はこれをどのように行うかを今のところ理解していませんでした。

誰かが私にヒントを教えてもらえますか?

4

1 に答える 1

1

検索アルゴリズムを使用して、MPLシーケンス内のタイプの最初の出現を指す「イテレータ」を取得できます。何かのようなもの:

typedef boost::mpl::find<TypeVector, T>::type MplIter;

次に、その「イテレータ」の位置で融合ベクトルをクエリします。

return boost::fusion::at_c<MplIter::pos::value>(fvec);

ただし、なぜMPLベクトルを使用するのかまったくわかりません。IIUC、getValueを次のように定義します。

template<class T>
T getValue(FusionVector_t fvec)
{
  typedef boost::mpl::find<TypeVector, T>::type MplIter;
  return boost::fusion::at_c<MplIter::pos::value>(fvec);
}

これは、TypeVectorとFusionVector_tが同じタイプのシーケンスを「含む」場合にのみ機能します。その場合は、FusionVector_tを使用して次のように記述してください。

template<class T>
T getValue(FusionVector_t fvec)
{
  return *boost::fusion::find<T>(fvec);
}

さらに、Fusionシーケンスの「インデックス」として「T」を使用する場合、これは、特定のタイプがシーケンスに1回だけ出現する場合にのみ意味があります。したがって、fusion::setはベクトルよりも適切であるように見えます。その場合、次のようになります。

typedef boost::fusion::set<char, int, long> FusionSet_t;

template<class T>
T getValue(FusionSet_t fset)
{
  return boost::fusion::at_key<T>(fset);
}
于 2010-10-01T20:33:34.387 に答える