¿Cómo pasar argumentos opcionales a un método en C ++? Cualquier fragmento de código ...
¿Cómo pasar argumentos opcionales a un método en C ++? Cualquier fragmento de código ...
Respuestas:
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
NULL
significa 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
.
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
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.
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/
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 )
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();
}
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;
}
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