为成员函数的 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 实施?
这不是 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);
我正在使用 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 实施?
这不是 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);