Usted tiene un increíble número de opciones para lograr los delegados en C++. Aquí están los que me vinieron a la mente.
Opción 1: funtores:
Un objeto de función puede ser creado por la aplicación de operator()
struct Functor
{
// Normal class/struct members
int operator()(double d) // Arbitrary return types and parameter list
{
return (int) d + 1;
}
};
// Use:
Functor f;
int i = f(3.14);
Opción 2: expresiones lambda (C++11 solamente)
// Syntax is roughly: [capture](parameter list) -> return type {block}
// Some shortcuts exist
auto func = [](int i) -> double { return 2*i/1.15; };
double d = func(1);
Opción 3: punteros de función
int f(double d) { ... }
typedef int (*MyFuncT) (double d);
MyFuncT fp = &f;
int a = fp(3.14);
Opción 4: puntero a funciones miembro (solución más rápida)
Ver Fast C++ Delegate (en The Code Project) .
struct DelegateList
{
int f1(double d) { }
int f2(double d) { }
};
typedef int (DelegateList::* DelegateType)(double d);
DelegateType d = &DelegateList::f1;
DelegateList list;
int a = (list.*d)(3.14);
Opción 5: std::function
(o boost::function
si su biblioteca estándar no lo soporta). Es más lento, pero es el más flexible.
#include <functional>
std::function<int(double)> f = [can be set to about anything in this answer]
// Usually more useful as a parameter to another functions
Opción 6: unión (utilizando std::bind)
permite configurar algunos parámetros de antelación, convenientes para llamar a una función miembro, por ejemplo.
struct MyClass
{
int DoStuff(double d); // actually a DoStuff(MyClass* this, double d)
};
std::function<int(double d)> f = std::bind(&MyClass::DoStuff, this, std::placeholders::_1);
// auto f = std::bind(...); in C++11
Opción 7: Plantillas
aceptar cualquier cosa con tal de que coincide con la lista de argumentos.
template <class FunctionT>
int DoSomething(FunctionT func)
{
return func(3.14);
}
¿Estás hablando de C++ administrado en .NET? – dasblinkenlight
¿Miraste la [página de Wikipedia para la Delegación] (http://en.wikipedia.org/wiki/Delegation_%28programming%29)? –
'delegado' no es un nombre común en lenguaje C++. Debe agregar cierta información a la pregunta para incluir el contexto en el que la ha leído. Tenga en cuenta que si bien el patrón puede ser común, las respuestas pueden diferir si habla de * delegate * en general, o en el contexto de la CLI de C++ o cualquier otra biblioteca que tenga una implementación particular de * delegate *. –