Nombre de paramètres Variable en fonction en C++
Comment je peux avoir un nombre variable de paramètres dans ma fonction en C++.
Analogique en C#:
public void Foo(params int[] a) {
for (int i = 0; i < a.Length; i++)
Console.WriteLine(a[i]);
}
public void UseFoo() {
Foo();
Foo(1);
Foo(1, 2);
}
Analogique en Java:
public void Foo(int... a) {
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
public void UseFoo() {
Foo();
Foo(1);
Foo(2);
}
- Comme d'autres l'ont souligné, un variadic fonction est précisément ce que vous cherchez. Mais, sauf si vous prévoyez sur l'envoi d'un mélange de types à la fonction, vous êtes mieux de simplement en passant un pointeur ou une référence à un vecteur contenant vos paramètres à la place.
Vous devez vous connecter pour publier un commentaire.
Ceux-ci sont appelés Variadic fonctions. Listes de wikipédia exemple de code pour C++.
cstdarg
l'en-tête doit être utilisé. Me semble clair.va_list
est un type. Plus tout le reste dans cstdarg/stdarg.h sont des macros.va_list
dans l'espace de noms global. Il doit la mettre dans lestd
espace de noms, mais il est permis aussi de mettre dans l'espace de noms global (une grande raison pourquoi le C++ en-têtes spécifiques vraiment ne pas fournir de valeur).<cmath>
devrait être très différent de<math.h>
?Le réel C++ solution est variadic templates. Vous aurez besoin d'un assez récents du compilateur et de l'activer C++11 de l'aide si nécessaire.
Deux manières de traiter les "faire la même chose avec tous les arguments de la fonction" problème: de manière récursive, et avec une moche (mais très très conforme aux Normes) solution.
La solution récursive ressemble un peu à ceci:
Il génère un symbole pour chaque collection d'arguments, et puis, un pour chaque étape dans la récursivité. Ce n'est pas optimale pour dire le moins, de sorte le génial C++ les gens ici, DONC la pensée de un grand tour d'abuser de l'effet secondaire d'une liste d'initialisation:
Code n'est pas généré pendant un million d'légèrement différentes instanciations du modèle, et comme un bonus, vous obtenez préservé afin de vous des arguments de la fonction. Voir la réponse à faire à la nitty gritty les détails de cette solution.
Côté de l'autre réponses, si vous êtes juste essayer de passer un tableau d'entiers, pourquoi pas:
Vous ne pouvez pas l'appeler dans le paramètre de forme, cependant. Vous auriez à utiliser les variadic fonction figurant dans vos réponses. C++0x permettra variadic templates, ce qui permettra de type-safe, mais pour l'instant, c'est essentiellement de la mémoire et de la coulée.
Vous pourrait émuler une sorte de variadic paramètre->vecteur chose:
Utilisation:
En C++11 et plus tard, vous pouvez également utiliser l'initialiseur de listes.
Voir Variadic des fonctions en C, Objective-C, C++, et D
Vous devez inclure stdarg.h et ensuite utiliser
va_list
,va_start
,va_arg
etva_end
, comme l'exemple de l'article de Wikipédia montre. C'est un peu plus encombrant que le Java ou le C#, parce que le C et le C++ n'ont guère de prise en charge intégrée pour les varargs.Si vous n'avez pas de soins sur la portabilité, vous pourriez port cette C99 code de C++ à l'aide de gcc de la déclaration des expressions:
Que vous pourriez faire quelque chose de similaire avec C++0x' expressions lambda, mais la version de gcc que j'utilise (4.4.0) ne les supporte pas.
GManNickG et Christoph réponses sont bonnes, mais variadic fonctions vous permettent de pousser dans le ... paramètre que vous voulez, pas que des nombres entiers. Si vous sera voulez dans la avenir, pour pousser de nombreuses variables et les valeurs de différents types dans une fonction sans utiliser variadic fonction, car il est trop difficile ou trop compliqué pour vous, ou vous n'aimez pas la manière de l'utiliser ou que vous ne voulez pas inclure les en-têtes requis pour l'utiliser, alors vous pouvez toujours utiliser
void**
paramètre.Par exemple, Stephan202 posté le:
cela peut aussi être écrit comme:
Maintenant l'utiliser comme ça:
pour le code complet:
De SORTIE:
Je fais le mien, comme dans c++ builder xe.xx: