Me gustaría poder definir una función que toma una interfaz, pero se puede cumplir con un delegado o función que brinde la misma funcionalidad. Por ejemplo, en C++ que puedo escribir algo como:Intercambiando delegado/función e interfaz en D2
typedef std::function<int (float)> toInt;
void fun(toInt dg) { ... }
struct impl1 {
int operator()(float x) { ... }
};
int impl2(float x) { ... }
Y luego llamo utilizando la aplicación:
fun(impl1());
fun(&impl2);
(Este Float-> conversión int es sólo un ejemplo simplificado para ilustrar el principio, no es mi funcionalidad real).
me gustaría lograr algo similar en D. mi ingenuo intento fue así:
interface toInt {
int opCall(float);
}
void fun(toInt dg) { ... }
int impl2(float x) { ... }
fun(impl2);
El compilador se queja en esta última línea que no se puede convertir implícitamente el tipo impl2 Toint. Probablemente pueda agregar una implementación de diversión sobrecargada y hacer que la conversión sea explícita, pero me preguntaba si habría una manera más elegante y general de hacerlo, como en el ejemplo anterior de C++.
Gracias por ayudar a un novato :) Esta parece ser la solución más práctica. Sin embargo, agrega una capa adicional de direccionamiento indirecto desde la perspectiva de la persona que llama: está llamando a fun (x, f) en lugar de a f (x), como sería el caso con std :: function. Traté de arreglar esto con std.curry! (invirtiendo el orden de los parámetros en fun() y usando alias curry! (fun, x) fun1; fun1 (0.0);), pero el compilador no está contento: Error: "template tst.main.curry! (fun, x) .curry (T) if (is (typeof (fun (arg, T.init)))) no coincide con ninguna declaración de plantilla de función "(no se puede deducir el argumento de la plantilla). – Eitan
Pude hacerlo funcionar usando [alias] curry! (Fun! Impl1, x) funX; funX (4.4); [/ code] El problema aquí es que la plantilla 'diversión' debe expandirse a la función 'diversión' antes de que 'curry' sepa cómo trabajar con ella. Este es probablemente un escenario bastante común que debería agregarse al stdlib, sin embargo. Por supuesto, podrías hacerlo más genérico usando el cursivo alias [code] (¡diversión! (Typeof (x)), x) funX; [/ code] para que no tenga que repetir todo el tipo de x, posiblemente complejo, para curry de consumidor. –