2015-08-27 1 views
2

Je veux prendre un nombre variable d'arguments de fonction, et dans la fonction elle-même, enveloppe chaque argument de fonction en utilisant une classe wrapper de modèle et passe ces classes wrapper comme arguments à une autre fonction.Comment utiliser des modèles variadiques pour envelopper un nombre variable d'arguments de fonction?

Dites si j'ai une classe de modèle qui enveloppe simplement une variable.

template<class T> 
class Wrapper 
{ 
public: 
    Wrapper(T t) : t_(t) 
. 
. 
    {} 
private: 
    T t_; 
} 

et moi avons une fonction f qui appelle la fonction g, en passant dans les classes wrapper pour chaque argument de f- g.

template <typename T1, typename T2, typename T3> 
void f(T1 a, T2 b, T3 c) 
{ 
    g(Wrapper<T1>(a), Wrapper<T2>(b), Wrapper<T3>(c)); 
} 

Fonction g est pas important, mais pourrait être par exemple une séquence de fonctions surchargées, chacun avec un nombre différent et le type de Wrapper des classes comme ses paramètres.

Est-il possible d'utiliser des modèles variadique pour appeler la méthode du modèle f avec un nombre variable d'arguments, en passant dans le même nombre d'arguments, mais plutôt avec leurs classes d'emballage en fonction g?

Toute aide très appréciée, Tony

+0

Voulez-vous dire [quelque chose comme ça] (http://ideone.com/rc8rqc)? Pas sûr que j'ai compris la question. – WhozCraig

Répondre

1

Le terme technique est parameter packs.

Et il devrait aussi « facile » que

template<typename... T> 
void f(T... args) 
{ 
    g(Wrapper<T>(args)...); 
} 

Bien sûr, il vous oblige à avoir la fonction g appropriée.

+0

Merci. Je n'ai pas réalisé aussi à quel point les packs de paramètres sont flexibles. Par exemple remplacer l'appel à la fonction g par ceci: g (& Wrapper (* args) ...); permet de déréférencer des pointeurs en tant qu'arguments de la fonction f, pour former des classes Wrapper. Ensuite, le pointeur de chaque classe Wrapper est transmis à g à la place. – Tony