我有一个用C++编写的类接口.我有一些实现此接口的类也是用C++编写的.这些是在更大的C++程序的上下文中调用的,它基本上实现了"main".我希望能够在Python中编写这个接口的实现,并允许它们在更大的C++程序的上下文中使用,就好像它们只是用C++编写的一样.
有很多关于连接python和C++的文章,但我无法弄清楚如何做我想要的.我能找到的最近的是:http://www.cs.brown.edu/~jwicks/boost/libs/python/doc/tutorial/doc/html/python/exposing.html#python.class_virtual_functions,但这不是没错.
更具体地说,假设我有一个现有的C++接口定义如下:
// myif.h
class myif {
public:
virtual float myfunc(float a);
};
Run Code Online (Sandbox Code Playgroud)
我想要做的是:
// mycl.py
... some magic python stuff ...
class MyCl(myif):
def myfunc(a):
return a*2
Run Code Online (Sandbox Code Playgroud)
然后,回到我的C++代码中,我希望能够说出类似的话:
// mymain.cc
void main(...) {
... some magic c++ stuff ...
myif c = MyCl(); // get the python class
cout << c.myfunc(5) << endl; // should print 10
}
Run Code Online (Sandbox Code Playgroud)
我希望这很清楚;)
我正在将一个用C++编写的库包装到Python API libwebqq中
有一种在boost函数中定义的类型.
typedef boost::function<void (std::string)> EventListener;
Run Code Online (Sandbox Code Playgroud)
Python级别可以定义"EventListener"变量回调.
C++级别中还有一个映射结构,它是类Adapter中的event_map.event_map的关键类型是QQEvent枚举类型,event_map的值类型是包含EvenListener的类"Action".
class Action
{
EventListener _callback;
public:
Action (){
n_actions++;
}
Action(const EventListener & cb ){
setCallback(cb);
}
virtual void operator()(std::string data) {
_callback(data);
}
void setCallback(const EventListener & cb){
_callback = cb;
}
virtual ~Action(){ std::cout<<"Destruct Action"<<std::endl; n_actions --; }
static int n_actions;
};
class Adapter{
std::map<QQEvent, Action > event_map;
public:
Adapter();
~Adapter();
void trigger( const QQEvent &event, const std::string data);
void register_event_handler(QQEvent event, EventListener callback);
bool is_event_registered(const QQEvent & …Run Code Online (Sandbox Code Playgroud)