C++11:在类构造函数中使用非静态成员函数作为默认参数

3

我想创建一个带有回调函数的类,可以使用外部函数作为回调,或者默认情况下该类将分配一个成员函数作为回调。请看我的代码示例:

#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);
}

如代码中所提到的,样例只有在定义'static'时才能正常工作。当不使用static关键字时,会出现以下错误:
无法将类型为“void(Foo ::)()”的“Foo :: defaultCallback”转换为类型“Foo :: CallbackType {aka std :: function}”
但是,我也想将此类用作父类,并且希望将'defaultCallback'定义为虚拟函数(这在同时定义为静态函数时不可能)。是否有人建议如何使代码在不使用静态成员函数作为默认构造函数参数的情况下正常工作?

1
这里有一个重要的区别,静态方法和普通类方法之间存在着重要的区别。您可以在此处找到可能的解决方案:https://dev59.com/wWsz5IYBdhLWcg3w6MJS - Marco
@Marco 谢谢,那真的很有用,我想我可以这样做。 - donald
1个回答

3
class Foo
{
public:
  using CallbackType = std::function<void(void)>;

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

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

  void defaultCallback(void) {}

  CallbackType _callback;
};

“explicit”关键字的目的是什么? - donald
1
@donald 防止从 std::function<void(void)>Foo 的隐式转换。 - Piotr Skotnicki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接