¿Se puede utilizar el resultado de una llamada de función como un valor de parámetro predeterminado?

StackOverflow https://stackoverflow.com/questions/202718

  •  03-07-2019
  •  | 
  •  

Pregunta

¿Existe un buen método para escribir encabezados de funciones C / C ++ con parámetros predeterminados que sean llamadas a funciones?

Tengo un encabezado con la función:

int foo(int x, int y = 0);

Estoy trabajando en una base de código grande donde muchas funciones llaman a esta función y dependen de este valor predeterminado. Este valor predeterminado ahora necesita cambiar a algo dinámico y estoy buscando una forma de hacerlo:

int foo(int x, int y = bar());

Donde barra () es una función que genera el valor predeterminado basado en algunos parámetros del sistema. Alternativamente, este prototipo de función se vería así:

int foo(int x, int y = baz.bar());

Donde baz es una función que pertenece a un objeto que no se ha creado en el archivo de encabezado.

¿Fue útil?

Otros consejos

Yo usaría dos funciones sobrecargadas:

int foo (int x, int y);

int foo (int x) {return foo (x, bar);}

Si permite que la función de reenvío esté en línea, es probable que la penalización de rendimiento sea pequeña a cero. Si mantiene el cuerpo fuera de línea en un archivo sin encabezado, puede haber un costo de rendimiento (probablemente sea pequeño), pero mucha más flexibilidad en la implementación y menor acoplamiento.

Sí. Lo que has escrito trabajos.

¿Qué tiene de malo simplemente eliminar el parámetro opcional en la primera declaración y proporcionar una sobrecarga de un solo parámetro?

int foo(int x)
{
    Bar bar = //whatever initialization
    return foo(x,bar.baz());
}

int foo(int x,int y)
{
  //whatever the implementation is right now
}

Creo que esto tiende a ser mucho más limpio y flexible que tratar de usar algún valor predeterminado dinámico.

En el estándar, sección 8.3.6 (Argumentos predeterminados), párrafo 5, dan un ejemplo utilizando solo este enfoque. Específicamente, indica que los argumentos predeterminados son expresiones , por lo que se aplica una llamada a la función, aunque con restricciones como la búsqueda de nombres y la compatibilidad de tipos.

En mi lugar de trabajo, hemos utilizado firmas como esta:

void An_object::An_object(
  const Foo &a,
  const Bar &b,
  const Strategem &s = Default_strategem()
);

para permitir que los clientes anulen un comportamiento en un constructor de clase. Fue útil para el comportamiento condicional que afectó el rendimiento de un traductor ...

Tangencial, pero eso me parece que introduciría problemas de dependencia en el futuro. Me gustaría ir con el enfoque de stbuton.myopenid.com.

Debería ser perfectamente válido llamar a una función global o hacer referencia a un objeto global en este contexto, siempre que la declaración de la función / objeto esté dentro del alcance. Puede o no ser aconsejable (en términos de buen diseño), pero debería funcionar.

Intenta hacer que bar () sea una función miembro estática. Esto permitirá que cualquier parte del programa que tenga una clase estática en su alcance pueda acceder a él. Por ejemplo:

clase Foo { público:

static int bar (); };

Entonces declararías:

int foo (int x, int y = Foo :: bar ());

Si necesita objetos diferentes, pase la instancia del objeto en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top