Vous avez un nombre incroyable de choix pour obtenir des délégués en C++. Voici celles qui me sont venues à l'esprit.
Option 1 : foncteurs :
Un objet fonction peut être créé en implémentant 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);
Option 2 : expressions lambda ( C++11 seulement)
// 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);
Option 3 : pointeurs de fonction
int f(double d) { ... }
typedef int (*MyFuncT) (double d);
MyFuncT fp = &f;
int a = fp(3.14);
Option 4 : pointeur vers les fonctions membres (solution la plus rapide)
Voir Délégué C++ rapide (sur Le projet Code ).
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);
Option 5 : std::fonction
(ou boost::function
si votre bibliothèque standard ne le supporte pas). C'est plus lent, mais c'est le plus 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
Option 6 : liaison (en utilisant std::bind )
Permet de définir certains paramètres à l'avance, pratique pour appeler une fonction membre par exemple.
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
Option 7 : modèles
Accepter n'importe quoi tant que cela correspond à la liste d'arguments.
template <class FunctionT>
int DoSomething(FunctionT func)
{
return func(3.14);
}
4 votes
Parlez-vous de C++ géré sous .NET ?
2 votes
Avez-vous regardé le Page Wikipedia pour Délégation ?
6 votes
delegate
n'est pas un nom courant dans le langage c++. Vous devez ajouter quelques informations à la question pour inclure le contexte dans lequel vous l'avez lu. Notez que même si le motif est commun, les réponses peuvent être différentes si vous parlez de délégué en général, ou dans le contexte de C++CLI ou de toute autre bibliothèque qui a une implémentation particulière de délégué .0 votes
@SirYakalot - vous devriez accepter une des réponses ! : )
0 votes
@user1158692 J'attends généralement jusqu'à ce que je doive faire une grande reconstruction et ensuite faire un backlog de sélection des bonnes réponses.
6 votes
Attendre 2 ans ? ;)
6 votes
J'attends toujours...