【问题标题】:C++, Fulfilling typedef with lambda?C++,用 lambda 实现 typedef?
【发布时间】:2018-12-03 09:29:48
【问题描述】:

我有一个函数比如:

typedef void(*timercallback)(void);
void timer1_attachInterrupt(timercallback userFunc);

我希望调用成员方法而不是 C 风格的函数,所以我尝试了以下 lambda:

timer1_attachInterrupt([this](void) -> void { _member_method(); });

但是我得到编译器错误:

没有合适的从“lambda [] void () -> void”到 “定时器回调”存在

据我所见,lambda 具有像 typedef 一样的 void 参数,并像 tyepdef 一样返回 void。我错过了什么?

【问题讨论】:

  • 阿隆多?如果是这样添加标签。

标签: c++ lambda arduino typedef


【解决方案1】:

我错过了什么?

lambda 创建一个闭包 object 因为它需要捕获状态。因此,您不能只将它传递到需要常规函数指针的位置。

由于您的 API 没有为将状态传递给回调做出任何规定,因此您将需要使用一些令人不快的东西,例如全局变量。

如果你可以修改timer1_attachInterrupt1,那么我建议你允许它接受任何(类型擦除)函子。 std::function 正是实现这一目标的实用工具:

using timercallback = void(void);
void timer1_attachInterrupt(std::function<timercallback> userFunc);

1很明显,在 编辑之后,OP 不能。但我将建议留给任何能够修改他们的功能的人。

【讨论】:

  • 我无法修改 timer1_attachInterrupt。我以前确实使用过全局变量,并且不得不将我的大部分数据存储在类之外。我试图让它更面向对象。
  • @uhsl_m - 你的问题完全是由于糟糕的 API 设计。它是全局状态。
【解决方案2】:

好的,我想对答案发表评论,但因为代表。点我不能直接。 我的不是回答,而是评论上面的 std::function 建议。

你 /op 必须真正注意:std::function 可能在它的实现中使用 new()/malloc。如果那是我,那将是我想要的最后一件事 - 处理 ISR 时的任何堆分配。 (更糟糕的是,由于创建/销毁导致的不受控制的分配/取消分配)。

你尝试做的事情不值得。

【讨论】:

    猜你喜欢
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多