【问题标题】:How to pass method(as callback) as param to method?如何将方法(作为回调)作为参数传递给方法?
【发布时间】:2020-07-03 07:39:58
【问题描述】:

我的Utils 类中有静态方法

这是定义

/*static*/ void Utils::copy_files(void(*progress_callback)(int, int),
        std::string const & path_from,
        std::string const & path_to)
    {
      ....
    }

这里使用

void TV_DepthCamAgent::progress_callback(int count, int copied_file)
{
    printf("Progress :: %d :: %d\n", count, copied_file);
}

void TV_DepthCamAgent::foo()
{
    ...
    shared::Utils::copy_files(progress_callback, path_from_copy, path_to_copy);
    ...
}

这是我得到的错误

“void (TV_DepthCamAgent::)(int count, int mapped_file)”类型的 E0167 参数与“void ()(int, int)”类型的参数不兼容

错误 C3867 'TV_DepthCamAgent::progress_callback':非标准语法;使用 '&' 创建指向成员的指针

我做错了什么?

【问题讨论】:

  • 这能回答你的问题吗? How can I pass a class member function as a callback?(假设 progress_callback 是非静态的)。基本上,您不能将成员函数作为回调传递,因为您需要一个实例来调用此函数。
  • [OT]:我们现在有std::filesysem
  • TV_DepthCamAgent::progress_callback 应该是static,或者copy_files 应该被修改。
  • @churill 是的,tnx
  • > 使用 '&' 创建指向成员的指针

标签: c++


【解决方案1】:

既然你已经标记了这个 C++,我假设你想要一个 C++ 解决方案。

从 C++11 开始,我们可以使用 std::function 代替笨拙的 C 风格的指针函数语法。

所以void(*progress_callback)(int, int) 变成了std::function<void(int, int)> progress_callback

关于为什么会出现该错误,是因为要传递函数指针,您必须通过引用传递函数

...
    shared::Utils::copy_files(&progress_callback);
...

当您在copy_files 中调用它时,您必须传递所需的参数。

应该为此使用 std::functionstd::bind 而不是您似乎正在编写的 C 风格

【讨论】:

  • o,这对我来说是新的,tnx!但是无论如何回调应该是静态的......我不能按原样传递类方法,我必须传递静态方法,对吧?
  • 不,使用std::bind(&ClassName::methodName, this) 同时查找std::bindstd::function。另外我不知道你来自什么编程背景(听起来像 java),但在 C++ 中,函数是一等公民,可以在类外部声明和使用,而不需要是静态的
  • 您也可以使用lambda expression 代替std::bind。这通常是可取的,因为 lambda 相对于 std::bind 的开销较低。
  • 你能看看这个问题吗stackoverflow.com/questions/60803852/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多