Come passare argomenti opzionali a un metodo in C ++?


112

Come passare argomenti opzionali a un metodo in C ++? Qualsiasi frammento di codice ...


9
Non si passano i parametri delle opzioni. Passi argomenti opzionali!
Chubsdad

Per un controllo più esplicito di quello fornito dalla prenotazione dei valori sentinella, controlla boost :: optional <>.
Tony Delroy

Risposte:


145

Di seguito è riportato un esempio di passaggio della modalità come parametro facoltativo

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

puoi chiamare myfunc in entrambi i modi ed entrambi sono validi

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1

Potete fornire qualche esempio relativo alla stringa?
Swapnil Gupta

void myfunc (int blah, char mode [] = NULL)
Pramendra Gupta

2
NULLindica un puntatore NULL, anche se sarebbe definito come letterale 0. Non è un nome universale per lo zero costante. Per gli interi (non puntatori) si consiglia di utilizzare i numeri: int mode = 0.
UncleBens

1
Se stai lavorando con una classe (file sorgente e di intestazione), dove definiresti il ​​valore predefinito?
AceFunk

2
@AceFunk Super tardi, ma il codice che ho visto ha il valore predefinito definito nell'intestazione. Se ci pensate, il sistema non saprebbe che potete omettere il valore se l'opzionale fosse definito nella sorgente
Marte

50

Una regola importante per quanto riguarda l'utilizzo dei parametri predefiniti: i
parametri predefiniti devono essere specificati all'estremità più a destra, una volta specificato un parametro del valore predefinito non è possibile specificare nuovamente un parametro non predefinito. ex:

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

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

@Chubsdad - Ahh..la mia pessima dichiarazione ambigua! la seconda affermazione lo riassume correttamente? "una volta specificato un parametro di valore predefinito non è possibile specificare nuovamente un parametro non predefinito"
Alok Save

1
Quindi, se capisco correttamente se ho più parametri opzionali, dovrei implementarli tutti o nessuno? Non posso scegliere di utilizzare 1 parametro opzionale ma non il resto?
Gerard

@ Gerard: L'esempio "Consentito" mostra un parametro facoltativo e non il resto del caso d'uso che è valido.
Alok Save

4
Capisco, ma cosa succederebbe se avessi int foo(int x, int y = 10, int z = 10)e volessi chiamare foo(1,2), quindi dando solo un parametro opzionale. Non sembravo essere in grado di farlo funzionare da solo.
Gerard

30

Potrebbe essere interessante per alcuni di voi che in caso di più parametri predefiniti:

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

Date le seguenti chiamate di funzione:

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

Viene prodotto il seguente output:

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

Riferimento: http://www.learncpp.com/cpp-tutorial/77-default-parameters/


1
Questo è quello che stavo cercando. Usa una funzione in grado di gestire un numero diverso di argomenti. Dichiarare la funzione con il valore predefinito nel file di intestazione, quindi definirla senza parametri predefiniti e quindi utilizzarla. Non c'è bisogno di sovraccaricare le funzioni
Teh Sunn Liu

15

Usa parametri predefiniti

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 = "" 

}

Nota: i seguenti sono mal formati

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

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

Grazie per la soluzione generale, stavo cercando di capire come fornire un valore predefinito per qualsiasi tipo arbitrario.
Anonimo

13

Per seguire l'esempio fornito qui, ma per chiarire la sintassi con l'uso di file di intestazione, la dichiarazione in avanti della funzione contiene il valore predefinito del parametro opzionale.

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

Con virgole che li separano, proprio come i parametri senza valori predefiniti.

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

In genere impostando un valore predefinito per un parametro:

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

Con l'introduzione di std :: optional in C ++ 17 puoi passare argomenti opzionali:

#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");
}

Produzione:

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.