Ben Chan introduced a way of simulating delegates in unmanaged code.
Although his method works I wanted to have a syntax similar found in the C# language. I also wanted to be able to use
Using my solution
Defining a Delegate is simple as this:
To add a new delegate handler to those defined above you have to choose whether you want to use a static/global function or
a member function. To subscribe a delegate you use a syntax similar to C#'s:
void Handler1(LPVOID source, DelegateArgs* args)
static void StaticHandler(LPVOID source, DelegateArgs* args)
OnBtnClick += NewClassDelegateHandler(MyClass, instance, Handler1);
OnBtnClick += NewDelegateHandler(&MyClass::StaticHandler);
LPVOID source = 0;
DelegateArgs* args = 0;
// you can also remove a delegate handler from the invocation list
// OnBtnClick -= NewClassDelegateHandler(MyClass, instance, Handler1);
NewDelegateHandler are defines that create the appropriate
DelegateHandler class. It
can be the
StaticDelegateHandler for static functions or
ClassDelegateHandler for member functions.
The async delegate only overrides the
Delegate::Invoke method by creating a thread to invoke the handlers. You can make your
delegate thread safe (
AsyncDelegate already is) by defining a Delegate like this
IMPORTANT: To use my solution you have to enable runtime type information in your project.