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