Скажем, у вас есть кортеж и вы хотите создать новый кортеж, применив метафункцию для каждого типа первого. Какая «самая эффективная метафанизация C++ для выполнения этой задачи? Можно ли также использовать вариационный шаблон C++ 0x для обеспечения лучшей реализации?Создание кортежей из кортежей
5
A
ответ
8
Как насчет этого один:
template<typename Metafun, typename Tuple>
struct mod;
// using a meta-function class
template<typename Metafun, template<typename...> class Tuple, typename ...Types>
struct mod<Metafun, Tuple<Types...>> {
typedef Tuple<typename Metafun::template apply<Types>::type...>
type;
};
Тогда
typedef std::tuple<int, bool> tuple_foo;
struct add_pointer {
template<typename T>
struct apply { typedef T *type; };
};
typedef mod<add_pointer, tuple_foo>::type tuple_ptrfoo;
Это использует класс metafunction обертывания apply
в нешаблонный. Это позволяет передавать его шаблонам C++ 03 (которые не могут принимать шаблоны с произвольными параметрами, просто делая template<typename...> class X
). Вы можете, конечно, принять чистую metafunction (а не класс) тоже
template<template<typename...> class Metafun, typename Tuple>
struct mod;
// using a meta-function
template<template<typename...> class Metafun, template<typename...> class Tuple,
typename ...Types>
struct mod<Metafun, Tuple<Types...>> {
typedef Tuple<typename Metafun<Types>::type...>
type;
};
И использовать std::add_pointer
шаблон
typedef mod<std::add_pointer, tuple_foo>::type tuple_ptrfoo;
Или вы можете обернуть его в класс, так он совместим с первым версия
// transforming a meta function into a meta function class
template<template<typename...> class Metafun>
struct ToClass {
template<typename ... T>
struct apply { typedef Metafun<T...> type; };
};
typedef mod<ToClass<std::add_pointer>, tuple_foo>::type tuple_ptrfoo;
Надеюсь, это поможет.
+0
Cool litb (awgn). –
Boost.MPL может представлять интерес, он имеет мета-функцию 'transform'. – GManNickG