¿Pasar una función que devuelve vacío a una función que acepta vacío? [cerrado]

Entonces, después de jugar un rato, no puedo conseguirlo... ¿por qué esto no sería ya parte del estándar?

template<class T> accept_all(T) {}
void give_void() {}
int give_int() { return 1;}

int main() {
accept_all(give_void());
accept_all(give_int());
}

Esto ahorraría un poco de molestia al usar especializaciones de clase de plantilla... Y en términos de sintaxis general, tiene poco sentido poder devolver un vacío y no poder pasar uno.

¿Hay algo que pueda hacer que no implique especializar una 'clase de mediador' fea para cada tipo de método para simplemente llamar a esta cosa?

Gracias.

EDITAR: ¿Cuál sería una buena manera de implementar una plantilla que acepte cualquier valor de retorno de función, entonces?

preguntado el 30 de julio de 12 a las 13:07

¿Por qué implementaría una función que acepta cualquier valor de retorno de función? -

Un problema es que void no es un valor, no es ningún valor en absoluto. Si miras give_void, no devuelve nada. -

2 Respuestas

Creo que se ve muy extraño. ¿Por qué simplemente no llamar a estas funciones consecutivas?

give_void();
accept_void();

Mucho más limpio.

Y en realidad no ahorras nada escribiendo accept_void(give_void()); incluso el número de símbolos que necesita ingresar es el mismo.

EDITAR No estoy seguro de entender realmente lo que quieres lograr, pero:

template <typename Result, typename Callable>
static Result func(Callable c)
{
    return c();
}

Respondido 30 Jul 12, 13:07

@ user1240436: vea mi edición, por favor - Andrés

C ++ te permite return void de una función (ver ¿Devuelve un código válido nulo?).

Sin embargo, devolver vacío es significativamente diferente de aceptar vacío; tenga en cuenta que int foo(void) es solo una sintaxis alternativa (y obsoleta) para int foo(), y solo existe por razones históricas de compatibilidad con C.

Su sugerencia rompe la invariante de que la cantidad de argumentos en una llamada de función es la misma que la cantidad de argumentos que acepta la función.

contestado el 23 de mayo de 17 a las 13:05

El estándar es confuso (como siempre). Mi vida sería más sencilla, si pasar un vacío nunca fuera un argumento 'real', sino una herramienta sintáctica para expresar un maniquí. Estoy un poco dividido entre tener clases de plantillas de proxy que manejen casos especiales y que el lenguaje simplemente habilite argumentos nulos como una extensión de la sintaxis de la plantilla. - ActiveTrayPrntrTagDataStrDrvr

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.