为成员函数的 MBED 回调正确的模板构造函数

Correct Template constructor for MBED Callback of member function

我正在使用 mbed 库并想将一个成员函数附加到 Ticker(定期调用回调函数),它也是一个成员。我的 class 可能有多个实例,我希望每个实例都能够管理自己的 Ticker 并允许回调函数处理其各自的数据。

代码:

* 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 class 实施?

Callback class

Ticker class

这不是 MyClass 不完整。关于Callback<MyClass>不完整。

Callback 主模板故意不完整。范围内的唯一专业化是

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

这意味着你需要给它传递一个函数类型,而且这个函数必须没有参数。这称为类型擦除。可以从许多不同的类似函数的值构造回调,但结果类型始终是 Callback <some-plain-function-type>。它的工作方式与 std::function 非常相似,除了 std::function 允许任意函数签名。

自从你的回调 returns 一个 void,你需要这样的东西:

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