Список комбинаций одного типа 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