从boost :: mpl :: vector获取boost :: fusion :: vector的索引

时间:2010-10-01 17:01:14

标签: c++ boost boost-mpl boost-fusion

我开始使用boost fusion和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向量中获取索引并在此函数中使用它,而不是将其作为模板参数传递给函数。 但到目前为止我还没弄清楚如何做到这一点。

有人可以给我一个提示吗?

1 个答案:

答案 0 :(得分:1)

您可以使用find算法获取指向MPL序列中第一个类型出现的“迭代器”。类似的东西:

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

然后在“iterator”的位置查询融合向量:

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”作为“索引”,这只有在给定类型在序列中只出现一次时才有意义。因此,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);
}