我必须使用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_;
};
始终为空。你能发现错误吗?
答案 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)
,您就必须使用一些静态变量。