【问题标题】:C++11: Use non-static member function as default argument in class constructorC++11:在类构造函数中使用非静态成员函数作为默认参数
【发布时间】:2016-07-28 01:19:42
【问题描述】:

我想创建一个带有回调函数的类,应该可以使用外部函数作为回调,或者该类默认分配一个成员函数作为回调。在此处查看我的代码示例:

#include <functional>

class Foo
{
public:
  typedef std::function<void(void)> CallbackType;

  Foo(CallbackType callback = defaultCallback): _callback(callback) {}

  // code sample works only if this function is defined static:
  static void defaultCallback(void) {}

  CallbackType _callback;
};

void externCallback(void) {}

int main()
{
  Foo fooExtern(externCallback);
}

如代码中所述,该示例仅在“defaultCallback”定义为静态时才有效。不使用 static 关键字时,出现错误:

无法将“Foo::defaultCallback”从“void (Foo::)()”类型转换为“Foo::CallbackType {aka std::function}”类型

但是,我还希望能够将此类用作父类,并且我想将“defaultCallback”定义为虚拟(在将其定义为静态时这是不可能的)。有没有人建议我如何在不使用静态成员函数作为默认构造函数参数的情况下使代码工作?

【问题讨论】:

  • 静态方法和普通类方法有一个重要的区别,在这里你有一个可能的解决方案:stackoverflow.com/questions/7582546/…
  • @Marco 谢谢,这真的很有用,我想我可以这样做。

标签: c++ c++11 static callback


【解决方案1】:
class Foo
{
public:
  using CallbackType = std::function<void(void)>;

  Foo() : Foo([this]{defaultCallback();}) {}

  explicit Foo(CallbackType callback) : _callback(callback) {}  

  void defaultCallback(void) {}

  CallbackType _callback;
};

【讨论】:

  • 天才 :) 非常感谢。 “显式”关键字的用途是什么?
  • @donald 阻止从 std::function&lt;void(void)&gt;Foo 的隐式转换
猜你喜欢
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-18
  • 2023-03-18
  • 1970-01-01
  • 2011-01-06
相关资源
最近更新 更多