2010-03-17 8 views
5

Скажем, у вас есть кортеж и вы хотите создать новый кортеж, применив метафункцию для каждого типа первого. Какая «самая эффективная метафанизация C++ для выполнения этой задачи? Можно ли также использовать вариационный шаблон C++ 0x для обеспечения лучшей реализации?Создание кортежей из кортежей

+1

Boost.MPL может представлять интерес, он имеет мета-функцию 'transform'. – GManNickG

ответ

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). –