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: Pouvons-nous faire cela sans introduire un TapeDef? strong> si j'essaie directement p> gcc / clang crache out p> Erreur: expression primaire attendue avant 'int' p>
blockQuote> Et si j'essaie de parent la parenthèse, le code compile, mais je crois que c'est une conformité non standard: P> AVERTISSEMENT: ISO C ++ interdit les littéraux composés [-WPASTANTIC] P>
blockQuote> p>
4 Réponses :
Pouvons-nous faire cela sans introduire un typlef? P>
sans typef, mais avec une variable p>
xxx pré> blockquote>
Merci, pourquoi le deuxième void () code> après
std :: avant code>?
@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 code> avant
std :: avant code>? Parce que la fonction peut renvoyer un objet qui surcharge
opérateur, (mytype, void (&) () ()) code>.
@Vsoftco Oui, vous pouvez lancer la valeur de retour de l'appelable ou faire ce que Jarod fait. Void () Code> n'est pas un type de fonction, c'est une expression de type
vide code>, et vous ne pouvez pas surcharger l'opérateur de virgule avec
vide code>.
Pourquoi avons-nous besoin de (void) code> avant
mannequin code>?
@Ivankush: Pour éviter tout avertissement (dans la plupart des compilateurs) pour une variable inutilisée.
in c ++ 17 Vous pouvez le faire avec des plis comme: Démo en direct Strong> P> P>
Dans cette expression
template<typename... Ts> void expander(Ts&&... ts) { (void(std::forward<Ts>(ts)()), ...); }
Vous pouvez le faire comme suit:
En fait, c'est vraiment intéressant, avancé. Pourquoi ne peut-je pas simplement utiliser int Dummy [] = {(std :: avant
@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
Utilisez
std :: initialisizer_list code>, si vous détestez vraiment le typedef.