gpt4 book ai didi

python - 使用 Boost::Python 进行高阶编程

转载 作者:太空狗 更新时间:2023-10-30 00:15:20 29 4
gpt4 key购买 nike

所以,我有一个简单的事件库,用 C++ 编写并使用了 Boost 库。我想将上述库公开给 Python,所以自然而然地我转向了 Boost::Python。最终我得到了要编译的代码,但现在我面临着相当大的问题:我的库使用高阶编程技术。例如,该库由三个主要类组成:事件类、事件管理器类和事件监听器类。事件监听器类带来了问题。代码:

    class listener{
public:
listener(){}
void alert(cham::event::event e){
if (responses[e.getName()])
responses[e.getName()](e.getData());
}
void setResponse(std::string n, boost::function<void (std::string d)> c){responses.insert(make_pair(n, c));}
void setManager(_manager<listener> *m){manager = m;}
private:
std::map<std::string, boost::function<void (std::string d)> > responses;
_manager<listener> *manager;

如您所见,函数 setResponse 就是问题所在。它需要一个函数传递给它,不幸的是,Boost::Python 在这种情况下不应用它的转换器魔法。当像下面这样调用时:

>>> import chameleon
>>> man = chameleon.manager()
>>> lis = chameleon.listener()
>>> def oup(s):
... print s
...
>>> lis.setResponse("event", oup)

它给出了这个错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
listener.setResponse(listener, str, function)
did not match C++ signature:
setResponse(cham::event::listener {lvalue}, std::string, boost::function<void ()(std::string)>)

所以,我的问题是,我该如何解决这个问题?它必须使用重载或包装器,因为我希望该库仍可由 C++ 调用。

最佳答案

您将需要一个围绕 setResponse 的包装器,它采用一个 boost::python::object 而不是一个函数。它应该将此 bp::object 存储在已知位置(可能是 listener 子类的成员变量)。

然后将一个不同的 c++ 函数传递给基础 setResponse,它将知道如何查找和调用 bp::object 中的函数。如果要在不同的线程上调用事件,您还需要确保正确处理 python 的全局解释器锁,如此处所述:boost.python not supporting parallelism? .

关于python - 使用 Boost::Python 进行高阶编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9472928/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com