¿Cómo pasar argumentos opcionales a un método en C ++?

112

¿Cómo pasar argumentos opcionales a un método en C ++? Cualquier fragmento de código ...

Swapnil Gupta
fuente
9
No pasa parámetros de opción. ¡Pasas argumentos opcionales!
Chubsdad
Para un control más explícito que el proporcionado al reservar valores centinela, consulte boost :: optional <>.
Tony Delroy

Respuestas:

145

Aquí hay un ejemplo de modo de paso como parámetro opcional

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

puedes llamar a myfunc de ambas formas y ambas son válidas

myfunc(10);     // Mode will be set to default 0
myfunc(10, 1);  // Mode will be set to 1
Pramendra Gupta
fuente
¿Puede proporcionar algún ejemplo relacionado con la cadena?
Swapnil Gupta
void myfunc (int blah, char mode [] = NULL)
Pramendra Gupta
2
NULLsignifica un puntero NULL, aunque se definiría como literal 0. No es un nombre universal para cero constante. Para enteros (no punteros) podría utilizar números: int mode = 0.
UncleBens
1
Si está trabajando con una clase (archivos fuente y de encabezado), ¿dónde definiría el valor predeterminado?
AceFunk
2
@AceFunk Muy tarde, pero el código que he visto tiene el valor predeterminado definido en el encabezado. Si lo piensa, el sistema no sabría que puede omitir el valor si el opcional se definió en la fuente
Marte
50

Una regla importante con respecto al uso de parámetros predeterminados: los
parámetros predeterminados deben especificarse en el extremo derecho, una vez que especifica un parámetro de valor predeterminado, no puede especificar un parámetro no predeterminado nuevamente. ex:

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

int DoSomething(int x, int z, int y = 10) -----------> Allowed 
Alok Save
fuente
@Chubsdad - ¡Ahh ... mi declaración ambigua! ¿La segunda afirmación lo resume correctamente? "una vez que especifica un parámetro de valor predeterminado, no puede especificar un parámetro no predeterminado de nuevo"
Alok Save
1
Entonces, si entiendo correctamente si tengo varios parámetros opcionales, ¿debería implementarlos todos o ninguno en absoluto? ¿No puedo elegir usar 1 parámetro opcional pero no el resto?
Gerard
@Gerard: El ejemplo "Permitido" muestra un parámetro opcional y no el resto del caso de uso que es válido.
Alok Save
4
Entiendo, pero ¿qué int foo(int x, int y = 10, int z = 10)pasaría si tuviera y quisiera llamar foo(1,2), por lo que solo da un parámetro opcional? No parecía ser capaz de hacerlo funcionar yo mismo.
Gerard
30

Puede ser interesante para algunos de ustedes que en caso de múltiples parámetros predeterminados:

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

Dadas las siguientes llamadas a funciones:

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

Se produce el siguiente resultado:

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

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

usuario2008151314
fuente
1
Esto es lo que estaba buscando. Use una función que pueda manejar diferentes números de argumentos. Declare la función con el valor predeterminado en el archivo de encabezado, luego defínalo sin los parámetros predeterminados y luego puede usarlo. No es necesario hacer una sobrecarga de funciones
Teh Sunn Liu
15

Usar parámetros predeterminados

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: Los siguientes están mal formados

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

template <typename T>
void func(T a, T b = a )
Prasoon Saurav
fuente
Gracias por la solución general, estaba tratando de averiguar cómo proporcionar un valor predeterminado para cualquier tipo arbitrario.
Anónimo
13

Para seguir el ejemplo dado aquí, pero para aclarar la sintaxis con el uso de archivos de encabezado, la declaración de avance de la función contiene el valor predeterminado del parámetro opcional.

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
fuente
10

Con comas separándolos, como parámetros sin valores predeterminados.

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
fuente
9

Por lo general, estableciendo un valor predeterminado para un parámetro:

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
fuente
8

Con la introducción de std :: Optional en C ++ 17, puede pasar argumentos opcionales:

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

Salida:

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

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

Fernando G. Testa
fuente