C回调和std :: function :: target

时间:2014-03-13 14:29:17

标签: c++

我必须使用C库来抓取图像,它具有流功能。所以当调用start_stream方法时,我必须传递一个函数指针。我想将一个方法从一个类传递给start_stream函数。

以下是回调方法的签名:void StreamCallback( SomeType* img ) 我必须将void(* StreamCallbackPtr)( SomeType* img )传递给签名为start_stream的{​​{1}}方法

我有一个看起来像这样的课程:

int start_stream( StreamCallbackPtr stream_callback )

但遗憾的是class MyClass { private: void Callback( SomeType* img ) { std::cout << "grabbed" << std::endl; // Do something with the image ... } public: void StartStream() { std::function<void( SomeType* img )> cb = std::bind( &MyClass::Callback, this, std::placeholders::_1 ); if( not cb ) // if the call-wrapper has wrapped a callable object { std::cout << "error" << std::endl; exit(0); } ptr_fun_ = cb.target<FuncType*>(); if( ptr_fun_ != nullptr ) { start_stream( ptr_fun_ ); } else { std::cout << "error" << std::endl; exit(0); } } private: typedef void FuncType( SomeType* img ); FuncType* ptr_fun_; }; 始终为空。你能发现错误吗?

1 个答案:

答案 0 :(得分:4)

  • 您可以使用静态extern "C"功能。对于大多数平台,您也可以使用static成员函数,但正式它不需要与C兼容,也不能声明extern "C"。我认为在Solaris上必须禁用相关警告。

  • 您不能使用std::function,因为它不是C函数:它是具有operator()成员函数的C ++对象,一个仿函数。类似地,bind的结果和捕获任何东西的lambda(特别是捕获this指针的lmbda)。

  • 特定于平台的功能可用于实现动态创建的C功能,但这就像使用洲际H-bomb导弹射击g(单数)一样。

简而言之,请选择静态extern "C"函数。

如果需要,它可以使用静态变量转发到某个对象的成员函数。在回调接收客户端代码提供的数据指针参数的情况下,您可以将其用作this - 指针。但是,如果您要转发到对象的成员函数,则只要签名int start_stream( StreamCallbackPtr stream_callback),您就必须使用一些静态变量。