首页 > 解决方案 > C++:无法在赋值中将 A::lambda() 转换为 B::*function 指针

问题描述

我有一个 OneWireDriver 类:

class OneWireDriver;
typedef void (OneWireDriver::*StateHandler)(void);

class OneWireDriver{
    Timer *timer; //a pointer to a Timer object working for this OneWireDriver object
    void registerTimerCallback(void); //a method to set this timer's callback function
    StateHandler stateHandler; //a handler pointing to a function OneWireDriver will execute from the current state
    void executeState(void){ //a method to execute the function saved in stateHandler from another class
        (this->*stateHandler)();
    } 
    //...
};

类计时器有:

class Timer;
typedef void (Timer::*TimerCallback)(void);

class Timer{
    TimerCallback callback; //a pointer to a callback function which is executed when its period elapses
    void executeCallback(void){ //a method to execute the function saved in callback from another class
        (this->*callback)();
    } 
    //...
};

现在的挑战是使 Timer 的对象能够在 Timer 所属的 OneWireDriver 对象上运行 executeState(),而无需计时器明确知道它所属的 OneWireDriver 对象。

我的老师建议我尝试使用lambdas,所以我尝试了:

void OneWireDriver::registerTimerCallback(void){
    this->timer->callback = [&]{ this->executeState(); };
};

无法编译:

cannot convert 'OneWireDriver::registerTimerCallback()::<lambda()>' to 'TimerCallback {aka void (Timer::*)()}' in assignment

在这一点上,我怀疑是否甚至可以使用 lambdas 来分配一个类的方法以从另一个类执行,除非另一个类知道第一个类的身份(因为它一定不知道)。

1) lambda 表达式可以帮助我解决挑战吗?

2)如果不是,有什么办法可以解决Timer对象调用它所属的OneWireDriver对象的方法,而不知道OneWireDriverObject的问题?还是 Timer 不必知道其 OneWireDriver 对象的潜在解决方法?

标签: c++ooplambdafunction-pointers

解决方案


推荐阅读