以下是该场景:我正在使用一个使用函数指针进行回调的遗留库。重写遗留库不是一个可行的选择。但我也喜欢调用类成员函数而不是全局函数的回调。
据我所知,最好的选择是对使用全局类指针执行调度的固定数量的预定义全局函数进行硬编码:
foo *globalPointers[3];
void callback1() {globalPointers[0]->invoke(); }
void callback2() {globalPointers[1]->invoke(); }
void callback3() {globalPointers[2]->invoke(); }
void (*globalCallbacks[3])() = {&callback1, &callback2, &callback3};
class foo
{
public:
int idx;
foo()
{
idx = findFreeSlot();
globalPointers[idx] = this;
registerLibraryCallback(globalCallbacks[idx]);
}
~foo() {releaseSlot(idx);}
void invoke();
};
Yuck yuck yuck!是否有任何(可移植)方式在运行时动态创建新的回调函数,而不是在编译时对一组(在本例中为3)进行硬编码?换句话说,是否有一种(顺应)方式来记忆功能"并修改其局部变量?
当然,如果使用功能对象而不是全局函数指针等,所有这些问题都会消失。但是我再次陷入遗留库。