函数和函数指针等价

时间:2017-11-08 05:55:32

标签: c++ callback function-pointers

我有两节课; A类通知B类一些事件。

typedef void (*callbackb) (B *, int param1);

class A
{
  callbackb callme;
  B *parent;
};

class B
{
  A ai;
  void set_cb() { ai.callme = cb_handler; }
  static void cb_handler (B *obj, int param1) { obj->real_handler(param1); }
  void real_handler(int param1);
};

有两个等效的声明,callbackb和cb_handler,但其中一个是函数指针,另一个是函数。是否可以更改其中一个或两个,以便两者都链接到单个原型声明?

1 个答案:

答案 0 :(得分:1)

你不能像你想要的那样定义 cb_handler。但你当然可以根据相同的原型声明它们并让编译器检查它。它也阻止你隐藏指针语义,这是一件好事。方法如下:

  1. 将回调定义为函数类型

    typedef void callbackb(B *, int param1);
    
  2. 根据CB类型声明指针和静态成员:

    class A
    {
      callbackb *callme; // The pointer is explicit
      B *parent;
    };
    
    // Later
    class B
    {
      // ...
      static inline callbackb cb_handler; // This is a function declaration
    };
    // And this is the inline definition, you can put it in a header
    inline void B::cb_handler (B *obj, int param1) { obj->real_handler(param1); }
    
  3. 所以现在cb_handlercallme以相同的类型声明。您需要在定义 cb_handler时指定完整的原型,但它仍然可以是标题中的inline类外定义。

    编译器会检查cb_handler的定义是否与声明匹配,因此如果cb_handlercallbackb不同,您会收到通知。