首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用boost python传递函数引用

使用boost python传递函数引用
EN

Stack Overflow用户
提问于 2011-03-31 03:05:34
回答 1查看 1.3K关注 0票数 1

我在C++中有这样一个函数:

代码语言:javascript
复制
typedef boost::function<boost::shared_ptr<Object> (CL_DomElement*, std::string& desc)> Parser;
void registerParser(std::string type, Parser p);

// Later: exporting into python-module:
BOOST_PYTHON_MODULE(TypesManager)
{
    bp::def("RegisterParser", registerParser);
}

# Python code:
class TestObj(Object):
    @staticmethod
    def ParseTestObj(node, desc):
        pass

RegisterParser("test_obj", TestObj.ParseTestObj)

python代码中的Object是在c++代码中使用的导出类。

代码语言:javascript
复制
Boost.Python.ArgumentError: Python argument types in
    RegisterParser(str, function)
did not match C++ signature:
    RegisterParser(TypesManager {lvalue}, std::string, boost::function<boost::shared_ptr<Object> ()(CL_DomElement*, std::string&)>)

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-31 04:03:03

我不相信Boost Python知道如何将python函数转换为boost::function对象。我建议使用代理来获取python callable对象并模拟C++接口。快速示例模型(当然是未经测试的):

代码语言:javascript
复制
typedef boost::function<boost::shared_ptr<Object> (CL_DomElement*, std::string& desc)> Parser;
void registerParser(std::string type, Parser p);

struct ParserProxy
{
    bp::object callable;

    ParserProxy(bp::object callable)
    : callable(callable)
    { }

    boost::shared_ptr<Object> operator()(CL_DomElement* elem, std::string& desc)
    {
        bp::object obj = callable(elem, desc);
        return bp::extract<boost::shared_ptr<Object> >(obj);
    }
};

void registerParserByProxy(std::string type, bp::object callable)
{
    registerParser(type, ParserProxy(callable));
}

// Later: exporting into python-module:
BOOST_PYTHON_MODULE(TypesManager)
{
        bp::def("RegisterParser", registerParserByProxy);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5490962

复制
相关文章

相似问题

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