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

原创 2004年03月21日 17:43:00

前两天看程序员杂志
看到关于 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: functor2.h
#ifndef _FUNCTOR2_H_
#define _FUNCTOR2_H_

template <typename P1, typename P2>
class functor2
{
  class deleobject
  {
  };
  typedef void (*func_pt)(P1, P2);
  typedef void (deleobject::*mem_func_pt)(P1, P2);
  typedef void (deleobject::*cmem_func_pt)(P1, P2) const;
  functor_base<deleobject,
    func_pt, 
    mem_func_pt, 
    cmem_func_pt> base;
  
  public: 
    functor2() : base() {}
    functor2(func_pt pf) : base(pf) {}
    template<typename T> 
      functor2(const T *pObject, void (T::*fp)(P1, P2)) :
        base((const deleobject*)(pObject), 
          *((mem_func_pt*)(&fp))) {}
    template<typename T> 
      functor2(const T &pObject, void (T::*fp)(P1, P2)) :
        base((const deleobject*)(pObject), 
          *((mem_func_pt*)(&fp))) {}
    template<typename T> 
      functor2(const T *pObject, void (T::*fp)(P1, P2) const) :
        base((const deleobject*)(pObject), 
          *((cmem_func_pt*)(&fp))) {}
    template<typename T> 
      functor2(const T &pObject, void (T::*fp)(P1, P2) const) :
        base((const deleobject*)(pObject), 
          *((cmem_func_pt*)(&fp))) {}
  bool operator !=(const functor2& rhs) const { return !(*this == rhs); }
  bool operator ==(const functor2& rhs) const
  {
    return base == rhs.base;
  }
  bool operator ==(const void* rhs) const
  {
    return base == rhs;
  }
  functor2& operator =(const functor2& rhs)
  {
    base = rhs.base;
    return *this;
  }
  void operator()(P1 p1, P2 p2) const
  {
    if (base.m_pObject == NULL)
      (*base.m_pf)(p1, p2);
    else
      (base.m_pObject->*(base.m_pmf))(p1, p2);
  }
};

template <typename P1, typename P2>
inline functor2<P1, P2> make_functor(void (*fp)(P1, P2))
{
  return functor2<P1, P2>(fp);
}

template <class T, typename P1, typename P2>
inline functor2<P1, P2> make_functor(const T* tp, void (T::*fp)(P1, P2))
{
  return functor2<P1, P2>(tp, fp);
}

template <class T, typename P1, typename P2>
inline functor2<P1, P2> make_functor(const T* tp, void (T::*fp)(P1, P2) const)
{
  return functor2<P1, P2>(tp, fp);
}

#endif // #ifndef _FUNCTOR2_H_
 
//filename: functor2_rt.h
#ifndef _FUNCTOR2_RT_H_
#define _FUNCTOR2_RT_H_

template <typename R, typename P1, typename P2>
class functor2_rt
{
  class deleobject
  {
  };
  typedef R (*func_pt)(P1, P2);
  typedef R (deleobject::*mem_func_pt)(P1, P2);
  typedef R (deleobject::*cmem_func_pt)(P1, P2) const;
  functor_base<deleobject,
    func_pt, 
    mem_func_pt, 
    cmem_func_pt> base;
  
  public: 
    functor2_rt() : base() {}
    functor2_rt(func_pt pf) : base(pf) {}
    template<typename T> 
      functor2_rt(const T *pObject, R (T::*fp)(P1, P2)) :
        base((const deleobject*)(pObject), 
          *((mem_func_pt*)(&fp))) {}
    template<typename T> 
      functor2_rt(const T &pObject, R (T::*fp)(P1, P2)) :
        base((const deleobject*)(pObject), 
          *((mem_func_pt*)(&fp))) {}
    template<typename T> 
      functor2_rt(const T *pObject, R (T::*fp)(P1, P2) const) :
        base((const deleobject*)(pObject), 
          *((cmem_func_pt*)(&fp))) {}
    template<typename T> 
      functor2_rt(const T &pObject, R (T::*fp)(P1, P2) const) :
        base((const deleobject*)(pObject), 
          *((cmem_func_pt*)(&fp))) {}
  bool operator !=(const functor2_rt& rhs) const { return !(*this == rhs); }
  bool operator ==(const functor2_rt& rhs) const
  {
    return base == rhs.base;
  }
  bool operator ==(const void* rhs) const
  {
    return base == rhs;
  }
  functor2_rt& operator =(const functor2_rt& rhs)
  {
    base = rhs.base;
    return *this;
  }
  R operator()(P1 p1, P2 p2) const
  {
    if (base.m_pObject == NULL)
      return (*base.m_pf)(p1, p2);
    else
      return (base.m_pObject->*(base.m_pmf))(p1, p2);
  }
};

template <typename R, typename P1, typename P2>
inline functor2_rt<R, P1, P2> make_functor_rt(R (*fp)(P1, P2))
{
  return functor2_rt<R, P1, P2>(fp);
}

template <typename R, class T, typename P1, typename P2>
inline functor2_rt<R, P1, P2> make_functor_rt(const T* tp, R (T::*fp)(P1, P2))
{
  return functor2_rt<R, P1, P2>(tp, fp);
}

template <typename R, class T, typename P1, typename P2>
inline functor2_rt<R, P1, P2> make_functor_rt(const T* tp, R (T::*fp)(P1, P2) const)
{
  return functor2_rt<R, P1, P2>(tp, fp);
}

#endif // #ifndef _FUNCTOR2_RT_H_
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

用 C++ 实现 C# 中的 委托/事件 (1-delegateEMU.cpp)

前两天看程序员杂志 看到关于 C# 中的委托/事件 觉得用起来好像是挺方便的 本人热衷于 C++ 想想用 C++ 来模拟似乎也可以 于是就有了下面的代码... (VC6 不支持偏特化 本人...

C++模拟C#事件委托机制(一)

原文地址:点我跳转至原文 写在前面的话: 需要特别注意原文给出的代码是有问题的!!! 原文的主体思路是正确的,他实际上是利用模板的参数推导特性, 将类成员函数从类中剥离开来, 实现委托机制 ...

C++实现C#事件机制

  • 2011-11-22 18:31
  • 6.80MB
  • 下载

C#中的委托和事件(2)

  • 2009-03-30 15:36
  • 26KB
  • 下载

深入理解C#---2.事件?委托?傻傻分不清楚

一个简单的事件的例子:“单击一个按钮后保存一个文件” 在这个例子中事件是单击按钮,事件处理操作是保存文件。在C#中创建事件很简单public event EventHandler Click; //...

c++的Functor修正版

  • 2013-12-15 18:49
  • 929KB
  • 下载

C#的COM事件在C++和JAVA中触发和响应的实现

在C++中调用C#开发COM组件时,一般的接口调用都比较容易实现,但是对于COM组件中的事件,C++中要去响应却不好实现。因为C#中事件是采用委托机制,而C++中却没有委托的机制,这样就无法实现对应。...

C#中的委托和事件--2.将方法绑定到委托

将方法绑定到委托 看到这里,是不是有那么点如梦初醒的感觉?于是,你是不是在想:在上面的例子中,我不一定要直接在GreetPeople()方法中给 name参数赋值,我可以像这样使用变量: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)