-
June 22nd, 2013, 04:49 AM
#1
Member Function Delegate
Hi there,
I'm trying to write a simple Delegate class with a Bind() and Invoke() function. For now it only needs to support a void class function with no parameters. I've searched around and found quite a few exmaples, though, those class are heavily templated and I lose track trying to simplify it.
So far my code is following:
Code:
#include <windows.h>
class Test
{
public:
void DoSomething()
{
MessageBox(NULL, L"Test::DoSomething!", NULL, 0);
}
};
template<class tObject, void (tObject::*Func)()>
void Wrapper(void* Object)
{
return ((tObject *)(Object)->*Func)();
}
class Delegate
{
public:
typedef void (*FuncType)(void *);
template <class tObject>
void Bind(tObject *Object, void (tObject::*Callback)())
{
m_Object = Object;
m_Callback = &Wrapper<tObject, &tObject::DoSomething>; // Works, but need to replace DoSomething with Callback variable somehow
// ((tObject *)m_Object->*Callback)(); // This works, but needs to be in Invoke function, so these variables need saving somehow
};
void Invoke()
{
(*m_Callback)(m_Object); // Works if m_Callback is saved with Wrapper helper class
};
private:
void *m_Object;
FuncType m_Callback;
};
int WINAPI WinMain(HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
Test test;
Delegate dg;
dg.Bind(&test, &Test::DoSomething);
dg.Invoke(); // Call test.DoSomething();
return 0;
};
The part I am having difficulty with is assigning &Test::DoSomething to the m_Callback variable.
&tObject::DoSomething works, yet _Callback which I pass &Test::DoSomething to does not work.
Where am I going wrong?
Thanks.
[EDIT] Also, why does the following line work:
Code:
m_Callback = &Wrapper<tObject, &tObject::DoSomething>;
When wrapper is like:
Code:
template<class tObject, void (tObject::*Func)()>
void Wrapper(void* Object)
Should it not be Wrapper<class-typename, parameter-1>(parameter-2) // This currently creates an error
Last edited by FrOzeN89; June 22nd, 2013 at 05:29 AM.
-
June 22nd, 2013, 09:56 AM
#2
Re: Member Function Delegate
Originally Posted by FrOzeN89
I'm trying to write a simple Delegate class with a Bind() and Invoke() function. For now it only needs to support a void class function with no parameters.
And why do you want this? Why not just use std::function, boost::function or libsigc?
Cheers, D Drmmr
Please put [code][/code] tags around your code to preserve indentation and make it more readable.
As long as man ascribes to himself what is merely a posibility, he will not work for the attainment of it. - P. D. Ouspensky
-
July 6th, 2013, 12:00 AM
#3
Re: Member Function Delegate
Thanks. I went with std::function. I overlooked that somehow.
Posting Permissions
- You may not post new threads
- You may not post replies
- You may not post attachments
- You may not edit your posts
-
Forum Rules
|
Click Here to Expand Forum to Full Width
|