C ++: невозможно преобразовать A :: lambda () в указатель функции B :: * при присваивании - PullRequest
0 голосов
/ 07 мая 2020

У меня есть класс 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)();
    } 
    //...
};

Класс Timer имеет:

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 способным запускать executeState () для объекта OneWireDriver, который Таймер принадлежит без того, чтобы таймер явно знал объект OneWireDriver, которому он принадлежит.

Мой учитель посоветовал мне попробовать использовать lambdas для этого, поэтому я попробовал :

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

Что не может быть скомпилировано с:

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

На этом этапе я сомневаюсь, что можно вообще использовать лямбды для назначения метода из одного класса, который будет выполняться из другой класс, если другой класс не знает идентичность первого (потому что он не должен знать).

1) Могут ли лямбда-выражения помочь мне решить проблему?

2) Если нет, есть ли какие-нибудь способ решить проблему объекта Timer, вызывающего метод объекта OneWireDriver, которому он принадлежит, не зная OneWireDriverObject? Или потенциальный обходной путь, при котором таймеру не нужно знать свой объект OneWireDriver?

...