我在C++中有这样一个函数:
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++代码中使用的导出类。
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&)>)我做错了什么?
发布于 2011-03-31 04:03:03
我不相信Boost Python知道如何将python函数转换为boost::function对象。我建议使用代理来获取python callable对象并模拟C++接口。快速示例模型(当然是未经测试的):
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);
}https://stackoverflow.com/questions/5490962
复制相似问题