Передача нестатической функции-члена с помощью bind

Я использую библиотеку GxEPD2 для связи с дисплеем электронной бумаги. Теперь я хотел использовать метод drawPaged этой библиотеки с отображением объекта.

Я также написал свой собственный класс, из которого я хочу печатать вещи на дисплее.

Вот соответствующий код для MyClass.h:

class MyClass{
    //some variables and methods
    void drawClass(); //this is public
    void drawClassCallback(const void* v1); //this is private
    //    this is actually a uint8_t --^
}

А вот MyClass.cpp:

void MyClass::drawClass(){
    //some display preparation
    uint8_t var; //A variable to pass information from the callback to this method since it is needed later
    display.drawPaged(std::bind(&MyClass::drawClassCallback, this, &var));
    //some code where I need var with info from the callback
}

Я получаю следующую ошибку:

нет соответствующей функции для вызова 'GxEPD2_BW::drawPaged(std::_Bind_helper::type)'

примечание: кандидат: void GxEPD2_BW::drawPaged(void ()(const void), const void*) [with GxEPD2_Type = GxEPD2_290; short unsigned int page_height = 296u] void drawPaged(пустота (drawCallback)(const void), const void* pv)

Я также пытался display.drawPaged(std::bind(&MyClass::drawClassCallback, this, std::placeholders::_1), &var) без успеха.

Я уже наткнулся на этот пост, однако решение, представленное там (и используемое выше), в этом случае не работает.

Почему это?

, 👍2


1 ответ


1

В вашем примере MyClass вызову drawPaged() присваивается только один аргумент, в то время как, согласно библиотеке, ему требуется два:

void drawPaged(void (*drawCallback)(const void*), const void* pv)

Первым аргументом является указатель на функцию (или тот, который завернут в std::bind!). Вторым аргументом, по-видимому, являются некоторые данные, которые будут переданы этой функции. (согласно [связанному API)

Ошибка на самом деле объясняет это, она подозревает, что вы пытаетесь вызвать void GxEPD2_BW::drawPaged(void ()(const void), const void*). Следовательно, он упоминает об этом как о кандидате.

Что вам нужно сделать, это что-то вроде этого:

display.drawPaged(std::bind(&MyClass::drawClassCallback, this, std::placeholders::_1), &var);

std::заполнители::_1-это заполнитель, представляющий аргумент var, который будет передан при его вызове.

,