2008-09-17 6 views
2

En C++ 0x Je voudrais écrire une fonction comme ceci:En C++, pouvez-vous avoir une fonction qui modifie un tuple de longueur variable?

template <typename... Types> 
void fun(typename std::tuple<Types...> my_tuple) { 
    //Put things into the tuple 
} 

J'ai d'abord essayé d'utiliser une boucle sur int i puis faites:

get<i>(my_tuple); 

Et puis stocker une valeur dans le résultat. Cependant, get ne fonctionne que sur constexpr.

Si je pouvais extraire les variables du tuple et les passer à une fonction matricielle variée, je pourrais facilement recourrir à travers les arguments, mais je n'ai aucune idée de comment obtenir les variables hors du tuple sans get. Des idées sur la façon de faire cela? Ou est-ce que quelqu'un a une autre façon de modifier ce tuple?

Répondre

4

Depuis les « i » dans

get<i>(tup) 

doit être une constante de compilation, modèle instanciation est utilisé pour « itérer » (en fait récursion) à travers les valeurs. Les tuples Boost ont les méta-fonctions "length" et "element" qui peuvent être utiles ici - je suppose que C++ 0x les a aussi.

+0

Merci! Mon code ressemble maintenant à ceci: template void fun (nom de fichier std :: tuple my_tuple) { get (my_tuple); amusant (my_tuple); } –

3

Boost.Fusion vaut le coup d'oeil. Il peut «itérer» sur std::pair, boost::tuple, certains autres conteneurs et ses propres types de tuple, bien que je ne pense pas qu'il supporte encore std::tuple.

0

Jetez un oeil à la section 6.1.3.4 de TR1, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

get est défini pour les deux const et tuples qualifiés non const et renvoie le type de référence approprié. Si vous changez votre déclaration de fonction aux personnes suivantes:

template 
void fun(typename std::tuple& my_tuple) { 
    //Put things into the tuple 
}

Ensuite, l'argument de votre fonction est un tuple non-const et obtenir vous permettra d'effectuer les travaux nécessaires une fois que vous avez écrit l'itération en utilisant les informations fournies dans les réponses précédentes.

0

AFAICT, les tuples C++ doivent fondamentalement être manipulés avec la récursivité; il ne semble pas y avoir de véritables moyens d'empaqueter/déballer les tuples sauf en utilisant la seule gestion de modèle variadique du système de types.

Questions connexes