2010-03-17 8 views
5

Dites que vous avez un tuple et que vous voulez générer un nouveau tuple en appliquant une métafonction sur chaque type du premier. Quelle est la métafonction C++ la plus efficace à accomplir pour cette tâche? Est-il également possible d'utiliser le modèle variadique C++ 0x pour fournir une meilleure implémentation?Génération de tuples à partir de tuples

+1

Boost.MPL peut être intéressant, il a une méta-fonction 'transform'. – GManNickG

Répondre

8

Comment « bout celui-ci:

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

Puis

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; 

C'est en utilisant une classe métafonction en enveloppant le apply dans un non-modèle. Cela permet de passer aux templates C++ 03 (qui ne peuvent pas accepter les templates avec des paramètres arbitraires en faisant simplement template<typename...> class X). Vous pouvez, bien sûr, accepter un métafonction pur (pas de classe) trop

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

Et utiliser le modèle std::add_pointer

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

Ou vous pouvez l'envelopper dans une classe il est donc compatible avec le premier version

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

Espérons que ça aide.

+0

Litb cool (awgn). –