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 ...


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

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 

@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/


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 )

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();
}

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

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;
}

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.