我正在设置一个成员函数作为我正在使用的C库的回调. C库设置如下的回调:
typedef int (*functionPointer_t)(myType1_t*,myType2_t*,myType3_t*); setCallback(param1,param2,functionPointer,param4)
我想使用boost :: bind(如果可能的话)传入函数指针.我希望指向的函数是实例化类的成员,而不是静态成员.例如.
Class A { public: A(); protected: int myCallback(myType1_t*,myType3_t*); //aka functionPointer_t }
可以使用boost :: bind和boost :: function来完成吗?根据How can I pass a class member function as a callback?(第3个答案),我可以声明以下内容(某处或作为typedef):
boost::function<int (A*,myType1_t*,myType3*> myCallbackFunction
然后在A(ctor)中的某处调用boost :: bind在该类型上,并将其传递给C库调用.
这是可能的,还是我偏离基地?非常感谢.
解决方法
不.像boost :: function这样的Functor类型不会转换为与C回调机制一起使用的函数指针.
但是,大多数C回调机制都有某种令牌机制,因此您的回调函数(它是静态的)具有某种上下文信息.您可以使用它来编写一个包装类,将这些标记映射到仿函数对象,并将执行传递到右侧:
class CallbackManager { public: typedef boost::function<int (type1*,type2*,type3*)> callback; static void setCallback(CallbackManager::callback cb) { void *token = ::setCallback(staticCallback); callbacks[token] = callback_I; } static void staticCallback(void* token,type1* a,type2* b,type3* c) { return mcallbacks[token](a,b,c); } private: static std::map<void*,callback > callbacks; };
原文地址:https://www.jb51.cc/c/119447.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。