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.