2010-03-17 30 views
5

Say masz krotka i chcą, aby wygenerować nowy krotki przez przyłożenie metafunkcji na każdego typu pierwszego. Jaka jest najskuteczniejsza metafuntja C++ do wykonania tego zadania? Czy możliwe jest również użycie szablonu variadic C++ 0x, aby zapewnić lepszą implementację?Generowanie krotki z krotek

+1

Boost.MPL mogą być interesujące, ma 'transform' meta-funkcji. – GManNickG

Odpowiedz

8

Jak „bout to jedno:

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

Następnie

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; 

To się stosując klasę metafunkcji owijając apply do non-szablonu. Że umożliwia przepuszczenie go do C++ 03 szablonów (które nie może przyjąć szablonów z dowolnych parametrów, po prostu robi template<typename...> class X). Możesz oczywiście przyjąć czystą metafunkcji (nie klasę) zbyt

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

i użyć std::add_pointer szablon

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

Można też owinąć go w klasie, więc jest to zgodne z pierwszą wersja

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

Mam nadzieję, że to pomaga.

+0

Cool litb (awgn). –