2010-03-17 9 views
5

Supongamos que tiene una tupla y desea generar una nueva tupla aplicando una metafunción en cada tipo de la primera. ¿Cuál es la metafunción de C++ más eficiente para lograr en esta tarea? ¿También es posible utilizar la plantilla variady C++ 0x para proporcionar una mejor implementación?Generando tuplas de tuplas

+1

Boost.MPL puede ser de interés, tiene una metafunción 'transformar'. – GManNickG

Respuesta

8

¿Qué tal éste:

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; 
}; 

Entonces

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; 

Eso está utilizando una clase metafunción envolviendo la apply en un no-plantilla. Eso permite pasarlo a plantillas C++ 03 (que no pueden aceptar plantillas con parámetros arbitrarios simplemente haciendo template<typename...> class X). Es posible, por supuesto, aceptar una metafunción puro (no una clase) también

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; 
}; 

Y el uso de la plantilla std::add_pointer

typedef mod<std::add_pointer, tuple_foo>::type tuple_ptrfoo; 

O se puede envolver en una clase por lo que es compatible con la primera versión

// 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; 

Espero que ayude.

+0

Cool litb (awgn). –