gpt4 book ai didi

c++ - 使用 boost::mpl 的类型组合

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:25:46 24 4
gpt4 key购买 nike

我有一个类型列表,我想从中构建包含两个元素的所有组合的列表。例如:

namespace mpl = boost::mpl;
typedef mpl::vector<int, long> typelist;
// mpl magic...
// the wanted list is equivalent to:
typedef mpl::vector<pair<int, int>, pair<int, long>,
pair<long, int>, pair<long, long> > combinations;

在这里,pair<T1,T2>可能是 std::pair<T1,T2> , 或 mpl::vector<T1,T2> .这该怎么做?当我们考虑 pair<T1, T2> == pair<T2, T1> 时,我也有兴趣删除重复项.
谢谢。

最佳答案

单个类型的组合列表int与类型列表 mpl::vector<int, long>可以通过调用 mpl::fold 来计算:

typedef fold<
mpl::vector<int, long>, vector<>,
push_back<mpl::_1, std::pair<int, mpl::_2> >
>::type list_of_pairs;

现在,如果我们将它包装到一个单独的元函数中并为初始类型列表的所有类型调用它,我们将得到:

typedef mpl::vector<int, long> typelist;

template <typename T, typename Result>
struct list_of_pairs
: mpl::fold<typelist, Result,
mpl::push_back<mpl::_1, std::pair<T, mpl::_2> > >
{};

typedef mpl::fold<
typelist, mpl::vector<>, mpl::lambda<list_of_pairs<mpl::_2, mpl::_1> >
>::type result_type;

BOOST_MPL_ASSERT(
mpl::equal<result_type,
mpl::vector4<
std::pair<int, int>, std::pair<int,long>,
std::pair<long,int>, std::pair<long,long>
> >::value);

编辑:回答第二个问题:

使结果只包含独特的元素(在你提到的意义上)有点复杂。首先你需要定义一个元函数比较两个元素并返回 mpl::true_/mpl::false_:

template <typename P1, typename P2>
struct pairs_are_equal
: mpl::or_<
mpl::and_<
is_same<typename P1::first_type, typename P2::first_type>,
is_same<typename P1::second_type, typename P2::second_type> >,
mpl::and_<
is_same<typename P1::first_type, typename P2::second_type>,
is_same<typename P1::second_type, typename P2::first_type> > >
{};

然后我们需要定义一个元函数,它试图在给定列表中找到给定元素:

template <typename List, typename T>
struct list_doesnt_have_element
: is_same<
typename mpl::find_if<List, pairs_are_equal<mpl::_1, T> >::type,
typename mpl::end<List>::type>
{};

现在,这可以用来构建一个新列表,确保没有插入重复项:

typedef mpl::fold<
result_type, mpl::vector<>,
mpl::if_<
mpl::lambda<list_doesnt_have_element<mpl::_1, mpl::_2> >,
mpl::push_back<mpl::_1, mpl::_2>, mpl::_1>

>::type unique_result_type;

所有这些都是我的想法,因此可能需要在这里或那里进行一些调整。不过思路应该是对的。


编辑:@rafak 概述的小更正

关于c++ - 使用 boost::mpl 的类型组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3322163/

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