gpt4 book ai didi

c++ - 如何将 boost::mpl::vector 转换为另一个 boost::mpl::vector?

转载 作者:行者123 更新时间:2023-11-30 05:17:34 24 4
gpt4 key购买 nike

假设我有一个 boost::mpl::vectormyvec”,例如这样定义:

using myvec = boost::mpl::vector<int, double, double>;

现在我想定义另一种类型 myvecex,它将每个 myvec 成员转换为带有添加字符串的 std::tuple。我想获得这样定义的类型:

using myvecex = boost::mpl::vector<std::tuple<int, std::string>, 
std::tuple<double, std::string>,
std::tuple<double, std::string> >;

但我不想重复自己并命名所有 vector 成员。相反,我想定义 some_smart_template 模板类型,我将以某种方式将每个成员类型转换为元组的逻辑。

using myvecex2 = some_smart_template<myvec>; 
static_assert(std::is_same<myvecex, myvecex2>::value);

在 C++ 中完全可行吗?

最佳答案

Boost.MPL 不仅为您提供容器,它还为您提供基于这些容器的算法。在这种情况下,您想要的是 transform :

template<
typename Sequence
, typename Op
, typename In = unspecified
>
struct transform
{
typedef unspecified type;
};

语义是你给它一个序列,MPL 指的是 Lambda Expression然后你得到另一个序列。具体来说:

using B = mpl::transform<A,
std::tuple<mpl::_1, std::string>
>::type;

或者至少如果 apply 支持像 std::tuple 这样的可变参数类模板,那将是可行的。因此,您只需要编写一个元函数类操作:

struct tuple_of_strings {
template <class T>
struct apply {
using type = std::tuple<T, std::string>;
};
};

using B = mpl::transform<A, tuple_of_strings>::type;

或元函数:

template <class T>
struct tuple_of_strings {
using type = std::tuple<T, std::string>;
};

using B = mpl::transform<A, tuple_of_strings<_1>>::type;

关于c++ - 如何将 boost::mpl::vector 转换为另一个 boost::mpl::vector?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42070514/

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