Передать ссылку на функцию с форсированным питоном - PullRequest
1 голос
/ 30 марта 2011

У меня есть такая функция в 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-коде - это экспортированный класс, который используется в typedef (из кода 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&)>)

Что я делаю не так?

1 Ответ

1 голос
/ 31 марта 2011

Я не верю, что Boost Python понимает, как преобразовать функцию python в объект boost :: function. Я бы предложил использовать прокси-сервер для получения вызываемого объекта Python и имитации интерфейса 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...