Tiene una cantidad increíble de opciones para lograr delegados en C ++. Aquí están los que me vinieron a la mente.
Opción 1: functores:
Se puede crear un objeto de función implementando 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 (solo C ++ 11 )
// 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 Delegado Fast C ++ (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 admite). 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: enlace (usando std :: bind )
Permite establecer algunos parámetros de antemano, conveniente 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
Acepte cualquier cosa siempre que coincida con la lista de argumentos.
template <class FunctionT>
int DoSomething(FunctionT func)
{
return func(3.14);
}
delegate
no es un nombre común en lenguaje c ++. Debe agregar 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 delegado en general, o en el contexto de C ++ CLI o cualquier otra biblioteca que tenga una implementación particular de delegado .