0

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

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

4

1 回答 1

1

您可以使用 find 算法来获取指向 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);
}

此外,如果您想使用“T”作为 Fusion 序列中的“索引”,这仅在给定类型在序列中仅出现一次时才有意义。因此,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 回答