【问题标题】:Reference to static member function & inheritance引用静态成员函数和继承
【发布时间】:2015-01-25 23:56:54
【问题描述】:

我在 C++ 程序中使用 libuv。我有两个继承自 C 的类 A 和 B。

我使用 libuv 并在 C 上声明了 uv_signal_t 的实例。创建 uv_signal_t 的实例需要传递回调。我可以轻松地将 lambda 传递给 C 函数来解决引用静态成员函数的问题:

const int32_t r = uv_signal_start(&this->signal, [](uv_signal_t *handle, int signum){}, SIGABRT);

但是我怎样才能为每个子类提供不同的回调实现呢?理想情况下,我会在 C.cpp 上实现一些通用代码,并在每个孩子上实现额外的代码。

更新

需要明确的是,我无法更改回调方法的签名,因为它是由 libuv 定义的。我可以编辑 libuv 的源代码,但我不确定我是否想深入。

【问题讨论】:

    标签: c++ c++11 callback libuv


    【解决方案1】:

    我将添加一个函数指针作为我的 C 类的属性,并根据需要在派生类上实现它。更多here

    【讨论】:

      【解决方案2】:

      我认为你可以在 lambda 中捕获this 指针,并通过它调用一个虚函数。然后可以在派生类中重写虚函数。

       const int32_t r = uv_signal_start(&this->signal, [this](uv_signal_t *handle, int signum){ return this->callback(); }, SIGABRT);
      

      【讨论】:

      • 错误:在此上下文中无法隐式捕获“this”
      • 然后显式捕获。
      • 我无法更改 lambda 的签名。
      • 我不认为捕获是闭包签名的一部分。
      • 顺便说一句,uv_xxx_t有一个数据字段,你可以设置成这个,这是通常的数据传递方式。
      猜你喜欢
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-16
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多