Передача нестатической функции-члена с помощью 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)
без успеха.
Я уже наткнулся на этот пост, однако решение, представленное там (и используемое выше), в этом случае не работает.
Почему это?
@Lithimlin, 👍2
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
, который будет передан при его вызове.
- esp32 Stack canary watchpoint срабатывает
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
- ESP32 отправляет данные на другой ESP32 без установления соединения Wi-Fi
- Увеличить частоту дискретизации на плате ESP32
- Отправить только один пакет с одного ESP32 на другой ESP32 без подтверждения
- Вызов функций одного класса из другого класса — Обратный вызов
- Обратный вызов родительского класса из дочернего класса
- Использование лямбд в качестве функций обратного вызова