首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Boost::Python的高阶编程

使用Boost::Python的高阶编程
EN

Stack Overflow用户
提问于 2012-02-28 05:55:41
回答 1查看 367关注 0票数 6

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

代码语言:javascript
复制
    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不能应用它的转换器魔力。当像下面这样调用时:

代码语言:javascript
复制
>>> import chameleon
>>> man = chameleon.manager()
>>> lis = chameleon.listener()
>>> def oup(s):
...  print s
... 
>>> lis.setResponse("event", oup)

它会给出这个错误:

代码语言:javascript
复制
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++调用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-28 23:30:39

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9472928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档