Конвертировать тип в Python - PullRequest
3 голосов
/ 31 марта 2011

Я использую Boost Python.Я экспортировал некоторую функцию, которая принимает класс CL_DomElement в качестве аргументов.Теперь, когда я запускаю приложение, у меня есть:

TypeError: No to_python (by-value) converter found for C++ type: CL_DomElement

Так что насчёт кода.Я экспортировал функцию, которая принимает указатель на функцию в аргументах.Вот код:

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));
}

// In some boost.python module
bp::def("RegisterParser", registerParserByProxy);

Я регистрирую его таким образом (в python):

class TestObj(Object):
    @staticmethod
    def ParseTestObj(node, desc):
        print 'Parser is called!'
# Register parser
RegisterParser("testobj", TestObj.ParseTestObj)

Он успешно регистрируется, я проверяю свою карту (регистратор регистра добавляет переданный ключ → значение вstd :: map) и там все в порядке (добавлено новое значение).Теперь я хочу вызвать переданный указатель:

boost::shared_ptr<Object> TypesManager::parseObject(CL_DomElement* objectTag, const std::string &type, std::string &desc)
{
    return (getParser(type))(objectTag, desc);
}

getParser возвращает указатель функции из std :: map с ключом type.


Итак, как я понимаю, что-тонеправильно с прохождением класса CL_DomElement.Но я сделал в своем модуле:

bp::class_<CL_DomElement>("CL_DomElement");

Я думаю, что это не должно предотвратить такие ошибки, которые я описал.Итак, что не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...