函数和函数指针等价
Function and function-pointer equivalence
我有两个class; class A 将某些事件通知 class 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,但其中一个是函数指针,另一个是函数。是否可以更改一个或两个,以便两者都链接到单个原型声明?
您不能定义 cb_handler
随心所欲。但是您当然可以根据相同的原型声明它们并让编译器检查它。它还会阻止您隐藏指针语义,这是一件好事。方法如下:
将回调定义为函数类型:
typedef void callbackb(B *, int param1);
根据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); }
所以现在 cb_handler
和 callme
是根据相同的类型声明的。在定义cb_handler
时需要指定完整的原型,但它仍然可以是header中的inline
out-of-class定义。
编译器将检查 cb_handler
的定义是否与声明匹配,因此如果 cb_handler
与 callbackb
不同,您将收到通知。
我有两个class; class A 将某些事件通知 class 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,但其中一个是函数指针,另一个是函数。是否可以更改一个或两个,以便两者都链接到单个原型声明?
您不能定义 cb_handler
随心所欲。但是您当然可以根据相同的原型声明它们并让编译器检查它。它还会阻止您隐藏指针语义,这是一件好事。方法如下:
将回调定义为函数类型:
typedef void callbackb(B *, int param1);
根据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); }
所以现在 cb_handler
和 callme
是根据相同的类型声明的。在定义cb_handler
时需要指定完整的原型,但它仍然可以是header中的inline
out-of-class定义。
编译器将检查 cb_handler
的定义是否与声明匹配,因此如果 cb_handler
与 callbackb
不同,您将收到通知。