王朝网络
分享
 
 
 

用 C++ 实现 C# 中的 委托/事件 (4-functor1)

王朝c#·作者佚名  2006-01-09
宽屏版  字体: |||超大  

前两天看程序员杂志

看到关于 C# 中的委托/事件

觉得用起来好像是挺方便的

本人热衷于 C++

想想用 C++ 来模拟似乎也可以

于是就有了下面的代码...

(VC6 不支持偏特化 本人工作环境就是 VC6 痛啊~~~)

没有返回值的函数用 delegate

否则就用 delegate_rt

functor 也一样 functorN/functorN_rt

delegate 的模板参数可以是函数指针(非成员函数)

也可以是 functor

还可以是 delegate

functor 可用 make_functor/make_functor_rt 来生成

要是有偏特化 就可以去掉讨厌的 _rt 了 :(

关于委托 boost里有现成的

不过可能 VC6 里用不了

这些代码旨在个人研究

如果大家发现其中问题 希望能指出

//filename: functor1.h

#ifndef _FUNCTOR1_H_

#define _FUNCTOR1_H_

template <typename P1>

class functor1

{

class deleobject

{

};

typedef void (*func_pt)(P1);

typedef void (deleobject::*mem_func_pt)(P1);

typedef void (deleobject::*cmem_func_pt)(P1) const;

functor_base<deleobject,

func_pt,

mem_func_pt,

cmem_func_pt> base;

public:

functor1() : base() {}

functor1(func_pt pf) : base(pf) {}

template<typename T>

functor1(const T *pObject, void (T::*fp)(P1)) :

base((const deleobject*)(pObject),

*((mem_func_pt*)(&fp))) {}

template<typename T>

functor1(const T &pObject, void (T::*fp)(P1)) :

base((const deleobject*)(pObject),

*((mem_func_pt*)(&fp))) {}

template<typename T>

functor1(const T *pObject, void (T::*fp)(P1) const) :

base((const deleobject*)(pObject),

*((cmem_func_pt*)(&fp))) {}

template<typename T>

functor1(const T &pObject, void (T::*fp)(P1) const) :

base((const deleobject*)(pObject),

*((cmem_func_pt*)(&fp))) {}

bool operator !=(const functor1& rhs) const { return !(*this == rhs); }

bool operator ==(const functor1& rhs) const

{

return base == rhs.base;

}

bool operator ==(const void* rhs) const

{

return base == rhs;

}

functor1& operator =(const functor1& rhs)

{

base = rhs.base;

return *this;

}

void operator()(P1 p1) const

{

if (base.m_pObject == NULL)

(*base.m_pf)(p1);

else

(base.m_pObject->*(base.m_pmf))(p1);

}

};

template <typename P1>

inline functor1<P1> make_functor(void (*fp)(P1))

{

return functor1<P1>(fp);

}

template <class T, typename P1>

inline functor1<P1> make_functor(const T* tp, void (T::*fp)(P1))

{

return functor1<P1>(tp, fp);

}

template <class T, typename P1>

inline functor1<P1> make_functor(const T* tp, void (T::*fp)(P1) const)

{

return functor1<P1>(tp, fp);

}

#endif // #ifndef _FUNCTOR1_H_

//filename: functor1_rt.h

#ifndef _FUNCTOR1_RT_H_

#define _FUNCTOR1_RT_H_

template <typename R, typename P1>

class functor1_rt

{

class deleobject

{

};

typedef R (*func_pt)(P1);

typedef R (deleobject::*mem_func_pt)(P1);

typedef R (deleobject::*cmem_func_pt)(P1) const;

functor_base<deleobject,

func_pt,

mem_func_pt,

cmem_func_pt> base;

public:

functor1_rt() : base() {}

functor1_rt(func_pt pf) : base(pf) {}

template<typename T>

functor1_rt(const T *pObject, R (T::*fp)(P1)) :

base((const deleobject*)(pObject),

*((mem_func_pt*)(&fp))) {}

template<typename T>

functor1_rt(const T &pObject, R (T::*fp)(P1)) :

base((const deleobject*)(pObject),

*((mem_func_pt*)(&fp))) {}

template<typename T>

functor1_rt(const T *pObject, R (T::*fp)(P1) const) :

base((const deleobject*)(pObject),

*((cmem_func_pt*)(&fp))) {}

template<typename T>

functor1_rt(const T &pObject, R (T::*fp)(P1) const) :

base((const deleobject*)(pObject),

*((cmem_func_pt*)(&fp))) {}

bool operator !=(const functor1_rt& rhs) const { return !(*this == rhs); }

bool operator ==(const functor1_rt& rhs) const

{

return base == rhs.base;

}

bool operator ==(const void* rhs) const

{

return base == rhs;

}

functor1_rt& operator =(const functor1_rt& rhs)

{

base = rhs.base;

return *this;

}

R operator()(P1 p1) const

{

if (base.m_pObject == NULL)

return (*base.m_pf)(p1);

else

return (base.m_pObject->*(base.m_pmf))(p1);

}

};

template <typename R, typename P1>

inline functor1_rt<R, P1> make_functor_rt(R (*fp)(P1))

{

return functor1_rt<R, P1>(fp);

}

template <typename R, class T, typename P1>

inline functor1_rt<R, P1> make_functor_rt(const T* tp, R (T::*fp)(P1))

{

return functor1_rt<R, P1>(tp, fp);

}

template <typename R, class T, typename P1>

inline functor1_rt<R, P1> make_functor_rt(const T* tp, R (T::*fp)(P1) const)

{

return functor1_rt<R, P1>(tp, fp);

}

#endif // #ifndef _FUNCTOR1_RT_H_

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有