1

Я использую библиотеку mbed и хочу присоединить функцию-член к Ticker (вызывает функцию обратного вызова на регулярном интервале), который также является членом. У меня могут быть экземпляры множителей моего класса, и я бы хотел, чтобы каждый из них мог управлять своим собственным Ticker и позволять функции обратного вызова обрабатывать соответствующие данные.Правильный конструктор шаблонов для MBED Обратный вызов функции-члена

Код:

* header */ 
class MyClass { 
    uint16_t time; 
    Ticker ticker; 
    void Init(); 
    void SendMessage(); 
}; 

/* source */ 
void MyClass:: SendMessage() { 
} 

void MyClass::Init() { 
    ticker.attach(Callback<MyClass>(this, &MyClass::SendMessage), time); 
} 

Это дает мне invalid use of incomplete type 'class mbed::Callback<MyClass>'

Почему MyClass должна быть полным для обертки для указателя функции члена? Я пропустил что-то фундаментальное или слишком зависим от реализации класса Callback?

Callback class

Ticker class

ответ

2

Это не о MyClass быть неполным. Это около Callback<MyClass>, будучи неполным.

Главный Callback шаблон оставляем недоработан намеренно. Единственной специализацией в области является

template <typename R> 
class Callback<R()> 

, что означает, что вам необходимо передать ей тип функции, а функция не должна иметь никаких аргументов. Это называется тип erasure. Обратный вызов может быть построен из множества различных функционально-подобных значений, но результирующий тип всегда равен Callback <some-plain-function-type>. Он очень похож на std::function, за исключением std::function позволяет произвольные сигнатуры функций.

Поскольку ваш обратный вызов возвращает void, вам нужно что-то вроде этого:

ticker.attach(Callback<void()>(this, &MyClass::SendMessage), time); 
+0

даенный. И уточненное название вопроса, так как оно не было на самом деле проблемой неполного типа. – ptpaterson