Comment passer des arguments optionnels à une méthode en C ++?

112

Comment passer des arguments optionnels à une méthode en C ++? Tout extrait de code ...

Swapnil Gupta
la source
9
Vous ne transmettez pas les paramètres d'option. Vous passez des arguments optionnels!
Chubsdad
Pour un contrôle plus explicite que celui fourni en réservant des valeurs sentinelles, consultez boost :: optional <>.
Tony Delroy

Réponses:

145

Voici un exemple de passage du mode en tant que paramètre optionnel

void myfunc(int blah, int mode = 0)
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}

vous pouvez appeler myfunc dans les deux sens et les deux sont valides

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1
Pramendra Gupta
la source
Pouvez-vous fournir un exemple lié à la chaîne?
Swapnil Gupta
void myfunc (int blah, char mode [] = NULL)
Pramendra Gupta
2
NULLsignifie un pointeur NULL, même s'il serait défini comme littéral 0. Ce n'est pas un nom universel pour la constante zéro. Pour les nombres entiers (non-pointeurs) , vous devez utiliser les numéros: int mode = 0.
UncleBens
1
Si vous travaillez avec une classe (fichiers source et en-tête), où définiriez-vous la valeur par défaut?
AceFunk
2
@AceFunk Super tard, mais le code que j'ai vu a la valeur par défaut définie dans l'en-tête. Si vous y réfléchissez, le système ne saurait pas que vous pouvez omettre la valeur si l'option facultative était définie dans la source
Mars
50

Une règle importante concernant l'utilisation des paramètres par défaut: les
paramètres par défaut doivent être spécifiés à l'extrémité la plus à droite, une fois que vous avez spécifié un paramètre de valeur par défaut, vous ne pouvez plus spécifier de paramètre autre que par défaut. ex:

int DoSomething(int x, int y = 10, int z) -----------> Not Allowed

int DoSomething(int x, int z, int y = 10) -----------> Allowed 
Alok Save
la source
@Chubsdad - Ahh ... ma mauvaise déclaration ambigüe! la deuxième déclaration résume-t-elle correctement? "une fois que vous avez spécifié un paramètre de valeur par défaut, vous ne pouvez plus spécifier de paramètre autre que celui par défaut"
Alok Save
1
Donc, si je comprends bien si j'ai plusieurs paramètres optionnels, je dois les implémenter tous ou aucun du tout? Je ne peux pas choisir d'utiliser 1 paramètre facultatif mais pas le reste?
Gerard
@Gerard: L'exemple "Autorisé" montre un paramètre facultatif et non le cas d'utilisation restant qui est valide.
Alok Sauvegardez le
4
Je comprends, mais que se passe-t-il si je devais avoir int foo(int x, int y = 10, int z = 10)et voudrais appeler foo(1,2), donc ne donner qu'un seul paramètre facultatif. Je n'ai pas semblé pouvoir le faire fonctionner moi-même.
Gerard
31

Il pourrait être intéressant pour certains d'entre vous qu'en cas de plusieurs paramètres par défaut:

void printValues(int x=10, int y=20, int z=30)
{
    std::cout << "Values: " << x << " " << y << " " << z << '\n';
}

Étant donné les appels de fonction suivants:

printValues(1, 2, 3);
printValues(1, 2);
printValues(1);
printValues();

La sortie suivante est produite:

Values: 1 2 3
Values: 1 2 30
Values: 1 20 30
Values: 10 20 30

Référence: http://www.learncpp.com/cpp-tutorial/77-default-parameters/

user2008151314
la source
1
C'est ce que je cherchais. Utilisez une fonction qui peut gérer un nombre différent d'arguments. Déclarez la fonction avec la valeur par défaut dans le fichier d'en-tête, puis définissez-la sans paramètres par défaut, puis vous pouvez l'utiliser. Pas besoin de faire une surcharge de fonction
Teh Sunn Liu
15

Utiliser les paramètres par défaut

template <typename T>
void func(T a, T b = T()) {

   std::cout << a << b;

}

int main()
{
    func(1,4); // a = 1, b = 4
    func(1);   // a = 1, b = 0

    std::string x = "Hello";
    std::string y = "World";

    func(x,y);  // a = "Hello", b ="World"
    func(x);    // a = "Hello", b = "" 

}

Remarque: les éléments suivants sont mal formés

template <typename T>
void func(T a = T(), T b )

template <typename T>
void func(T a, T b = a )
Prasoon Saurav
la source
Merci pour la solution générale, j'essayais de comprendre comment fournir une valeur par défaut pour tout type arbitraire.
Anonyme
14

Pour suivre l'exemple donné ici, mais pour clarifier la syntaxe avec l'utilisation de fichiers d'en-tête, la déclaration de transfert de fonction contient la valeur par défaut du paramètre facultatif.

myfile.h

void myfunc(int blah, int mode = 0);

myfile.cpp

void myfunc(int blah, int mode) /* mode = 0 */
{
    if (mode == 0)
        do_something();
     else
        do_something_else();
}
KenJ
la source
10

Avec des virgules les séparant, tout comme les paramètres sans valeurs par défaut.

int func( int x = 0, int y = 0 );

func(); // doesn't pass optional parameters, defaults are used, x = 0 and y = 0

func(1, 2); // provides optional parameters, x = 1 and y = 2
Ben Voigt
la source
9

Généralement en définissant une valeur par défaut pour un paramètre:

int func(int a, int b = -1) { 
    std::cout << "a = " << a;
    if (b != -1)        
        std::cout << ", b = " << b;
    std::cout << "\n";
}

int main() { 
    func(1, 2);  // prints "a=1, b=2\n"
    func(3);     // prints "a=3\n"
    return 0;
}
Jerry Coffin
la source
8

Avec l'introduction de std :: optional en C ++ 17, vous pouvez passer des arguments optionnels:

#include <iostream>
#include <string>
#include <optional>

void myfunc(const std::string& id, const std::optional<std::string>& param = std::nullopt)
{
    std::cout << "id=" << id << ", param=";

    if (param)
        std::cout << *param << std::endl;
    else
        std::cout << "<parameter not set>" << std::endl;
}

int main() 
{
    myfunc("first");
    myfunc("second" , "something");
}

Production:

id=first param=<parameter not set>
id=second param=something

Voir https://en.cppreference.com/w/cpp/utility/optional

Fernando G. Testa
la source