简单的C++委托 —— 用模板类实现类成员函数的回调
2016-01-25 16:37
344 查看
原文:http://www.cppblog.com/Zezese/archive/2010/07/25/121247.html
C++语言: 高亮代码由发芽网提供
template <class R, class P1, class P2>
class IDelegate
{
public:
virtual R Invoke(P1, P2) = 0;
};
template <class T, class R, class P1, class P2>
class CDelegate : public IDelegate<R, P1, P2>
{
protected:
typedef R (T::*pfnHandle)(P1, P2);
const pfnHandle m_pfn;
T* const m_pThis;
public:
CDelegate(T* const pThis, const pfnHandle pfn)
:m_pThis(pThis), m_pfn(pfn)
{
if (m_pThis == NULL || m_pfn == NULL)
{
throw;
}
}
virtual R Invoke(P1 p1, P2 p2)
{
return (m_pThis->*m_pfn)(p1, p2);
}
};
class CDelegateSource
{
public:
CDelegateSource()
: m_lpCallBack(NULL)
{
}
void SetCallBack(IDelegate<bool, int, int>* newVal)
{
m_lpCallBack = newVal;
}
void DoSomething()
{
for (int i = 0; i < 10; i++)
{
if (m_lpCallBack != NULL)
{
m_lpCallBack->Invoke(i, i * i);
}
}
}
private:
IDelegate<bool, int, int>* m_lpCallBack;
};
class CDelegateTester
{
private:
bool OnCallBack(int nParam1, int nParam2)
{
printf("OnCallBack -> nParam1:%d, nParam2:%d\r\n", nParam1, nParam2);
return true;
}
CDelegate<CDelegateTester, bool, int, int> m_OnCallBack;
public:
CDelegateTester()
: m_OnCallBack(this, OnCallBack)
{
}
void Execute()
{
CDelegateSource src;
src.SetCallBack(&m_OnCallBack);
src.DoSomething();
}
};
void main()
{
CDelegateTester Tester;
Tester.Execute();
getchar();
}
阅读(647) | 评论(0) | 转发(0) |
0
上一篇:偷Microsoft师学MFC艺:且看C++如何支持反射
下一篇:C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
相关热门文章
欢迎letitbe413在ChinaUnix博...
欢迎linminchao在ChinaUnix博...
欢迎sagatagintoki在ChinaUnix...
欢迎abc16156在ChinaUnix博客...
欢迎yuliangguiguzi在ChinaUni...
test123
编写安全代码——小心有符号数...
使用openssl api进行加密解密...
一段自己打印自己的c程序...
sql relay的c++接口
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
C++语言: 高亮代码由发芽网提供
template <class R, class P1, class P2>
class IDelegate
{
public:
virtual R Invoke(P1, P2) = 0;
};
template <class T, class R, class P1, class P2>
class CDelegate : public IDelegate<R, P1, P2>
{
protected:
typedef R (T::*pfnHandle)(P1, P2);
const pfnHandle m_pfn;
T* const m_pThis;
public:
CDelegate(T* const pThis, const pfnHandle pfn)
:m_pThis(pThis), m_pfn(pfn)
{
if (m_pThis == NULL || m_pfn == NULL)
{
throw;
}
}
virtual R Invoke(P1 p1, P2 p2)
{
return (m_pThis->*m_pfn)(p1, p2);
}
};
class CDelegateSource
{
public:
CDelegateSource()
: m_lpCallBack(NULL)
{
}
void SetCallBack(IDelegate<bool, int, int>* newVal)
{
m_lpCallBack = newVal;
}
void DoSomething()
{
for (int i = 0; i < 10; i++)
{
if (m_lpCallBack != NULL)
{
m_lpCallBack->Invoke(i, i * i);
}
}
}
private:
IDelegate<bool, int, int>* m_lpCallBack;
};
class CDelegateTester
{
private:
bool OnCallBack(int nParam1, int nParam2)
{
printf("OnCallBack -> nParam1:%d, nParam2:%d\r\n", nParam1, nParam2);
return true;
}
CDelegate<CDelegateTester, bool, int, int> m_OnCallBack;
public:
CDelegateTester()
: m_OnCallBack(this, OnCallBack)
{
}
void Execute()
{
CDelegateSource src;
src.SetCallBack(&m_OnCallBack);
src.DoSomething();
}
};
void main()
{
CDelegateTester Tester;
Tester.Execute();
getchar();
}
阅读(647) | 评论(0) | 转发(0) |
0
上一篇:偷Microsoft师学MFC艺:且看C++如何支持反射
下一篇:C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
相关热门文章
欢迎letitbe413在ChinaUnix博...
欢迎linminchao在ChinaUnix博...
欢迎sagatagintoki在ChinaUnix...
欢迎abc16156在ChinaUnix博客...
欢迎yuliangguiguzi在ChinaUni...
test123
编写安全代码——小心有符号数...
使用openssl api进行加密解密...
一段自己打印自己的c程序...
sql relay的c++接口
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- C#, C++, Java性能对比
- C++ 程序员必读书目清单
- C#, C++, Java性能对比
- C++ 程序员必读书目清单
- C/C++文件IO输入输出操作——FILE*、fstream、windowsAPI
- 【转】基本JNI调用技术(c/c++与java互调)
- 【转】使用JNI进行混合编程:在C/C++中调用Java代码
- C++回调函数调用Java接口抽象函数
- C++读写文本文件
- C++中对文本文件的读写(iostream方法)
- Java调用C和C++函数时的JNI使用区别
- 【转】基本JNI调用技术(c/c++与java互调)
- 【转】使用JNI进行混合编程:在C/C++中调用Java代码
- C++回调函数调用Java接口抽象函数
- C++读写文本文件
- C++中对文本文件的读写(iostream方法)
- Java调用C和C++函数时的JNI使用区别
- C/C++文件IO输入输出操作——FILE*、fstream、windowsAPI
- 我的C++笔记
- 我的C++笔记