2010-05-01 4 views
1
myPreciousFunction(std::string s1 = "", std::string s2 = "") 
{ 
} 

int main() 
{ 
    myPreciousFunction(); 
} 

Puis-je rendre les arguments plus beaux? Je veux qu'il y ait des chaînes vides si aucun argument n'a été fourni.Arguments de chaîne par défaut

+2

que voulez-vous dire par "plus joli" - le code ci-dessus est la syntaxe correcte (et unique) pour les paramètres par défaut. –

+0

Je voulais aimer (chaîne s1 = 0; chaîne s2 = 0;) dans les arguments. –

+5

Pourquoi le zéro est-il "plus joli"? –

Répondre

15

vous pouvez envisager ceci:

myPreciousFunction(std::string s1 = std::string(), std::string s2 = std::string()) 
{ 
} 

Mais il ne semble pas vraiment plus jolie.

Aussi, si vous êtes des chaînes passant, vous pouvez les passer comme const&:

myPreciousFunction(const std::string& s1, const std::string& s2) 
{ 
} 

Ceci est un moyen standard pour éviter de faire face les données autour.

+1

J'y vais avec std :: string s1 = std :: string() parce que c'est génial! –

+4

Ou pour le mettre ensemble: 'myPreciousFunction (const std :: chaîne & s1 = std :: chaîne(), const std :: chaîne & s2 = std :: chaîne())' – UncleBens

+9

@John: Vous avez une mesure intéressante de la joliesse . – kennytm

-3

Vous pouvez omettre le qualificatif d'espace de nom pour le rendre plus propre.

using namespace std; 

void myPreciousFunction(string s1 = "", string s2 = "") 
{ 
} 
+7

les espaces de noms me paraissent plus jolis. –

+5

Remplir l'espace de noms global par ceci est très bien pour les fichiers source, car aucun autre fichier n'est affecté par cela. _But_: Si vous le faites dans un fichier d'en-tête, le fichier global de chaque source et fichier d'en-tête qui l'inclut sera rempli. Cela finira par causer des problèmes. –

1

Une alternative consiste à utiliser des fonctions surchargées, par ex. Bien que je ne sois pas sûr que ce soit plus joli, et certainement moins attrayant en ce qui concerne le code. (Arguments par défaut sont là pour éviter cela.)

10

Il existe actuellement une autre solution.

const std::string empty = std::string(); 

myPreciousFunction(const std::string &s1 = empty, const std::string &s2 = empty) 

Cela a l'avantage d'éviter la construction d'objets temporaires.

+0

Hmmm, c'est une idée géniale, une merveille serait un optimiseur faire de toute façon? Probablement pas je suppose. – ericcurtin

+0

@ericcurtin Non, mais curieusement le compilateur est autorisé une telle optimisation pour certaines listes d'initialisation. – Potatoswatter

+0

Vous pouvez également utiliser boost optionnel ou std optionnel (C++ 17), de cette façon vous n'avez pas besoin d'appeler le constructeur d'une chaîne. – ericcurtin

0

Vous pouvez utiliser une initialisation contreventement:

myPreciousFunction(const std::string& s1 = {}, const std::string& s2 = {}) 
{ 
} 
0

Vous pouvez utiliser en option ou augmenter std en option (17 C++), de cette façon vous ne devez pas appeler le constructeur d'une chaîne. Cela vous donnera des arguments vraiment optionnels. Ces solutions sont un paramètre par défaut de la chaîne ""

Questions connexes