2010-04-29 3 views
1

Est-il possible d'avoir une fonction avec des arguments variables et pas d'argument nommé?Liste d'arguments variables sans argument nommé?

Par exemple:

SomeLogClass("Log Message Here %d").Log(5); 
SomeLogClass("Log Message Here %d").Error(5); 
+0

tous vos exemples ne ont pas besoin des déclarations de fonction variadique. Peut-être pourriez-vous nous montrer les déclarations que vous voulez? –

Répondre

2

Jetez un oeil à QString's arg méthodes. Cela semble être quelque chose que vous cherchez.

Vous pouvez certainement rouler les vôtres, bien que la mise en œuvre puisse ne pas être vraiment triviale, surtout si vous souhaitez prendre en charge les spécificateurs de format printf. Si le style printf n'est pas nécessaire, enchaîner un type d'appel replace_all est possible.

+0

Merci. Je n'ai pas pensé à le faire de cette façon. –

+0

J'aime vraiment ça, ça évite astucieusement le problème! – Dov

1

Pouvez-vous écrire du code comme ci-dessus - oui vous pouvez. Mais vous ne pouvez pas écrire portable une fonction variadique sans au moins un paramètre non variadique. Dans printf(), par exemple, c'est la chaîne de format. En d'autres termes, vous pouvez écrire la fonction est comme:

int printf(const char * format, ...); 

mais pas:

int printf(...); 
1

où je viens, nous utilisons ceci:

Log << "LogMessageHere: " << ErrorClass << 5 << whatever << std::endl; 

Il est pas exactement une réponse à vous la question, mais il est une solution à votre problème, et je pense qu'il est plus C++ comme.

0

La bonne réponse est non, vous ne pouvez pas définir seulement des arguments variables, parce que le mécanisme en C/C++ pour le faire utilise un argument fixe pour calculer une adresse, comme ceci:

void f(int a, ...) { 
    va_list args; 
    va_start(args, a); // without a, this macro DOESN'T WORK!!! 


} 

La réponse que vous avez signalée contourne les arguments par défaut. Mais ce que cela devrait enseigner aux débutants est que le fait de ne pas utiliser les arguments ne signifie pas que les arguments ne sont pas passés, cela signifie que vous n'avez pas besoin de les taper.

void f (int a = 0, ...) 

Alors, quand vous appelez f vous pouvez écrire:

f(); 

mais en interne, il est écrit f (0)

Questions connexes