使用C ++类成员函数作为C回调函数

使用C ++类成员函数作为C回调函数

我有一个C库,需要注册回调函数来定制一些处理。回调函数的类型是int a(int *, int *)

我正在编写类似于以下内容的C ++代码,并尝试将C ++类函数注册为回调函数:

class A {
  public:
   A();
   ~A();
   int e(int *k, int *j);};A::A(){
   register_with_library(e)}intA::e(int *k, int *e){
  return 0;}A::~A() {}

编译器抛出以下错误:

In constructor 'A::A()',error:
 argument of type ‘int (A::)(int*, int*)’ does not match ‘int (*)(int*, int*)’.

我的问题:

  1. 首先是可以注册一个C ++类的memeber函数,就像我想要做的那样,如果是这样的话怎么样?(我在http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html上阅读了32.8 。但在我看来它并没有解决问题)

  2. 是否有替代/更好的方法来解决这个问题?


偶然的你
浏览 1485回答 3
3回答

汪汪一只猫

如果成员函数是静态的,则可以这样做。类A的非静态成员函数具有隐式的第一个类型参数,class A*该参数对应于该指针。这就是为什么如果回调的签名也有第一个class A*类型的参数,你只能注册它们。

缥缈止盈

如果成员函数不是静态的,你也可以这样做,但它需要更多的工作(参见将C ++函数指针转换为c函数指针):#include&nbsp;<stdio.h>#include&nbsp;<functional>template&nbsp;<typename&nbsp;T>struct&nbsp;Callback;template&nbsp;<typename&nbsp;Ret,&nbsp;typename...&nbsp;Params>struct&nbsp;Callback<Ret(Params...)>&nbsp;{ &nbsp;&nbsp;&nbsp;template&nbsp;<typename...&nbsp;Args>&nbsp; &nbsp;&nbsp;&nbsp;static&nbsp;Ret&nbsp;callback(Args...&nbsp;args)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func(args...);&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;static&nbsp;std::function<Ret(Params...)>&nbsp;func;&nbsp;};template&nbsp;<typename&nbsp;Ret,&nbsp;typename...&nbsp;Params>std::function<Ret(Params...)>&nbsp;Callback<Ret(Params...)>::func;void&nbsp;register_with_library(int&nbsp;(*func)(int&nbsp;*k,&nbsp;int&nbsp;*e))&nbsp;{ &nbsp;&nbsp;&nbsp;int&nbsp;x&nbsp;=&nbsp;0,&nbsp;y&nbsp;=&nbsp;1; &nbsp;&nbsp;&nbsp;int&nbsp;o&nbsp;=&nbsp;func(&x,&nbsp;&y); &nbsp;&nbsp;&nbsp;printf("Value:&nbsp;%i\n",&nbsp;o);}class&nbsp;A&nbsp;{ &nbsp;&nbsp;&nbsp;public: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~A(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;e(int&nbsp;*k,&nbsp;int&nbsp;*j);};typedef&nbsp;int&nbsp;(*callback_t)(int*,int*);A::A()&nbsp;{ &nbsp;&nbsp;&nbsp;Callback<int(int*,int*)>::func&nbsp;=&nbsp;std::bind(&A::e,&nbsp;this,&nbsp;std::placeholders::_1,&nbsp;std::placeholders::_2); &nbsp;&nbsp;&nbsp;callback_t&nbsp;func&nbsp;=&nbsp;static_cast<callback_t>(Callback<int(int*,int*)>::callback);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;register_with_library(func);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}int&nbsp;A::e(int&nbsp;*k,&nbsp;int&nbsp;*j)&nbsp;{ &nbsp;&nbsp;&nbsp;return&nbsp;*k&nbsp;-&nbsp;*j;}A::~A()&nbsp;{&nbsp;}int&nbsp;main()&nbsp;{ &nbsp;&nbsp;&nbsp;A&nbsp;a;}这个例子在它编译的意义上是完整的:g++&nbsp;test.cpp&nbsp;-std=c++11&nbsp;-o&nbsp;test你需要c++11国旗。在您看到的代码中,register_with_library(func)调用func了动态绑定到成员函数的静态函数e。
打开App,查看更多内容
随时随地看视频慕课网APP