【问题标题】:C++ std::function syntax issuesC++ std::function 语法问题
【发布时间】:2018-05-31 03:33:32
【问题描述】:

我正在尝试存储一个函数指针,以便稍后回调:

Task->Sync->SetPeriodicTask( &TaskAssigner::ReadAndRelay );

TaskAssigner 类声明 void ReadAndRelay() 它拥有一个 SyncManager* Sync 对象。

(可能有点奇怪,但是子对象Sync需要每隔一定的时间回调到其父类的函数)。

我是这样尝试的:

void SyncManager::SetPeriodicTask(std::function<void()> func) {
    CB_func_periodic = func;
    //CB_func_periodic = std::bind(&func, this, std::placeholders::_1);
}

成员变量声明(SyncManager.h):

private:
    using func = std::function<void()>;
    func CB_func_periodic;

我不确定这里的正确语法是什么,因为我遇到了很多错误。 尝试搜索错误,但我找不到适合我的情况的答案,并且我不希望 SetPeriodicTask(..) 的参数太复杂而其他用户无法编写。 我应该如何处理?

【问题讨论】:

  • SetPeriodicTask 中的代码应该是CB_func_periodic = func;。 SetPeriodicTask 的参数应该不同
  • 发布MCVE 会改善问题,因为根据您发布的内容有几个未知数
  • @M.M 我之前尝试过你的建议,但参数相同。它应该以什么方式不同..?
  • 什么是TaskAssigner::ReadAndRelay???我没有在您的代码中看到它定义。无论如何,您的TaskAssigner::ReadAndRelay 很可能根本不是void ()。这就是你得到错误的原因。如果TaskAssigner声明了一个非静态的void ReadAndRelay(),那么就是void TaskAssigner::(),和void ()有很大的不同。
  • @AnT 尝试将 this 的任何 Sync 绑定到 TaskAssigner 的成员指针是没有意义的

标签: c++ function-pointers


【解决方案1】:

以下是基于您迄今为止发布的详细信息的一些示例代码:

#include <functional>

using func = std::function<void()>;

struct S
{
    func CB_func_periodic;
    void SetPeriodicTask( func f ) { CB_func_periodic = f; }
};

struct R
{
    void ReadAndRelay() {}
    S s;
};

int main()
{
    R r;
    r.s.SetPeriodicTask( [&] { r.ReadAndRelay(); } );
}

SetPeriodicTask 的参数应该是一个Callable,因为该函数调用它。成员函数的地址不可调用。

代码的结构应该保证在r被销毁后不能调用周期性任务。

【讨论】:

  • 这帮助我获得了正确的语法并且代码再次工作。谢谢你的课!
  • 如果我可以添加一个后续问题;如何检查 void SetPeriodicTask( func f )'s f 是否为 NULL?还是专门设置为NULL?
  • @MadsMidtlyng 请参阅https://stackoverflow.com/questions/21806632/how-to-properly-check-if-stdfunction-is-empty-in-c11。基本上你可以做if (f)检查,f = nullptr;
猜你喜欢
  • 2015-02-20
  • 2023-03-06
  • 2018-11-29
  • 1970-01-01
  • 2013-12-19
  • 2021-09-18
  • 2015-03-13
  • 1970-01-01
  • 2022-11-04
相关资源
最近更新 更多