gpt4 book ai didi

c++ - 从 boost::mpl::vector 获取 boost::fusion::vector 的索引

转载 作者:行者123 更新时间:2023-11-28 08:26:38 27 4
gpt4 key购买 nike

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

有人可以给我提示吗?

最佳答案

您可以使用查找算法获取指向某个类型在 MPL 序列中第一次出现的“迭代器”。像这样的东西:

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

然后在那个“迭代器”的位置查询 fusion vector :

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

但是,我根本不明白您为什么要使用 MPL vector 。 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 似乎比 vector 更合适。在这种情况下,您将:

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

template<class T>
T getValue(FusionSet_t fset)
{
return boost::fusion::at_key<T>(fset);
}

关于c++ - 从 boost::mpl::vector 获取 boost::fusion::vector 的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3841416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com