6
votes

Expander Varididic sans Typedef

Un astuce souvent utilisé pour effectuer une expansion des paramètres variadiques utilise une matrice de taille d'une taille Typedef en combinaison avec l'opérateur de la virgule, comme ci-dessous: xxx

Vivez sur Coliru

Pouvons-nous faire cela sans introduire un TapeDef? si j'essaie directement xxx

gcc / clang crache out

Erreur: expression primaire attendue avant 'int'

Et si j'essaie de parent la parenthèse, le code compile, mais je crois que c'est une conformité non standard:

AVERTISSEMENT: ISO C ++ interdit les littéraux composés [-WPASTANTIC]


1 commentaires

Utilisez std :: initialisizer_list , si vous détestez vraiment le typedef.


4 Réponses :


5
votes

Pouvons-nous faire cela sans introduire un typlef?

sans typef, mais avec une variable xxx


7 commentaires

Merci, pourquoi le deuxième void () après std :: avant ?


@Vsoftco Parce que les programmeurs responsables de C ++ utilisent la protection ... contre les opérateurs de virgules surchargés :)


@Praetorian Ohhhh oui, bien sûr, oublié à ce sujet;)


@Praetorian, mais alors ne devrait-il pas être le vide avant std :: avant ? Parce que la fonction peut renvoyer un objet qui surcharge opérateur, (mytype, void (&) () ()) .


@Vsoftco Oui, vous pouvez lancer la valeur de retour de l'appelable ou faire ce que Jarod fait. Void () n'est pas un type de fonction, c'est une expression de type vide , et vous ne pouvez pas surcharger l'opérateur de virgule avec vide .


Pourquoi avons-nous besoin de (void) avant mannequin ?


@Ivankush: Pour éviter tout avertissement (dans la plupart des compilateurs) pour une variable inutilisée.



3
votes

in c ++ 17 Vous pouvez le faire avec des plis comme: xxx

Démo en direct


0 commentaires

6
votes

Dans cette expression

template<typename... Ts>
void expander(Ts&&... ts)
{
    (void(std::forward<Ts>(ts)()), ...);
}


0 commentaires

2
votes

Vous pouvez le faire comme suit: xxx

https://ideone.com/ Bznxhd


2 commentaires

En fait, c'est vraiment intéressant, avancé. Pourquoi ne peut-je pas simplement utiliser int Dummy [] = {(std :: avant (ts) (), 0) ...}; ? Le code dans ce cas ne compile pas.


@vsoftco C'est pratiquement la même chose que la réponse de Jarod, mais elle ne gère pas tous les cas comme sa réponse, et a la verbosité inutile ajoutée de la spécification d'une taille de matrice. L'appel sans argument ne définit aucun tableau de taille 0, il est autorisé par GCC et Clang en tant qu'extension (avertissements Ideone cache si le code compile). Si vous voulez faire ce droit, le code doit être Int mannequin [Tailleof ... (TS) + 1] = {0, (STD :: Transférer (TS) (), 0). ..}; , mais il n'y a pas besoin de taille de tableau en premier lieu.