使用函数指针作为成员函数的代理

Use function-pointer as proxy to member-function

本文关键字:函数 成员 代理 指针      更新时间:2023-10-16

假设一个这样的类:

class Speaker {
public:
void (*saySomething)();
}

关键是我们可以实例化该类并调用存储的函数指针,以便让它说些什么(无论结果是什么(。这种方法的背景是让实际函数驻留在共享库中,Speaker充当某种包装类(函数在库中解析,指针分配给类中的变量(。

现在考虑我们有另一个扩展Speaker的类:

class ConstantSpeaker : public Speaker {
protected:
std::string message;
void doSpeak();
}

该方法的实现如下所示:

ConstantSpeaker::doSpeak() {
std::cout << message << std:endl;
}

现在我想以某种方式分配saySomething指针,以便以某种方式将呼叫重新路由到ConstantSpeaker::doSpeak()。但是,这不可能直接实现,因为doSpeak()是成员函数,saySomething是指向非成员函数的指针。
我的另一个想法是创建doSpeak()作为ConstantSpeaker的朋友功能。然后指针赋值工作正常,但现在doSpeak()需要将实际消息作为参数保存的对象才能访问消息。

对我来说,似乎应该有一种(或多或少(直接的方式来做到这一点,因为我只能在手头有Speaker实例时调用Speaker::saySomething。因此,相应对象的可用性应该不是问题,但我仍然无法弄清楚如何分配该指针。

我能想到的唯一解决方案是添加一个公共virtual Speaker::doSaySomething函数,其实现将调用函数指针(然后不再公共以防止误用(,并且可以被ConstantSpeaker覆盖以调用ConstantSpeaker::doSpeak()代替。
这个问题有没有其他解决方案?

另一种解决方案是使用标准std::function<void()>,然后仍然可以将其声明为公共。

此外,您可以使用指向成员函数的指针代替裸函数指针,但在基类中使用切片时请注意切片。

但是,我认为,最微不足道的方法就是使用virtual函数,就像你提到的。

也许多说说你的背景?您要解决的问题是什么?