En C ++, pouvez-vous avoir une fonction qui modifie un tuple de longueur variable?

StackOverflow https://stackoverflow.com/questions/80348

  •  09-06-2019
  •  | 
  •  

Question

En C ++ 0x, j'aimerais écrire une fonction comme celle-ci:

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 for sur int i puis faire:

get<i>(my_tuple);

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

Si je pouvais extraire les variables du tuple et les transmettre à une fonction variée basée sur un modèle, je pourrais facilement lire les arguments, mais je ne sais pas comment extraire les variables du tuple sans obtenir . Des idées sur comment faire cela? Ou est-ce que quelqu'un a un autre moyen de modifier ce tuple ?

Était-ce utile?

La solution

Depuis le " i " dans

get<i>(tup)

doit être une constante au moment de la compilation, l’instanciation de modèle est utilisée pour "itérer" et (effectivement recurse) à travers les valeurs. Les tuples Boost ont la " longueur " et " élément " méta-fonctions qui peuvent être utiles ici - je suppose que C ++ 0x les a aussi.

Autres conseils

Boost.Fusion vaut le coup d'oeil. Il peut "itérer" sur std :: pair , boost :: tuple , sur d'autres conteneurs et sur ses propres types de tuple, bien que je ne pense pas qu'il prenne en charge std :: tuple pour le moment.

AFAICT, les n-uplets C ++ doivent être gérés avec récursivité; il ne semble y avoir aucun moyen réel de compresser / décompacter les n-uplets , sauf en utilisant le seul système de traitement de modèle variadique du système de types.

Consultez 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 n-uplets qualifiés const et non-const et renvoie le type de référence approprié. Si vous modifiez votre déclaration de fonction comme suit:

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

Ensuite, l'argument de votre fonction est un tuple non-constant et get vous permettra de faire les affectations nécessaires une fois que vous aurez écrit l'itération à l'aide des informations fournies dans les réponses précédentes.

Regardez ma réponse ici pour un exemple de récursion de modèles permettant de dérouler les arguments d'un tuple lors d'un appel de fonction.

Comment développer une tuple dans les arguments de la fonction de modèle variadic?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top