Смешивание Boost.Python со сторонними привязками - PullRequest
0 голосов
/ 04 сентября 2018

Наше приложение предоставляет привязки Python через Boost.Python . Однако многие методы API используют типы, определенные сторонними библиотеками: один пример - Eigen , другой - Qt .

Для некоторых из этих библиотек иногда доступны сторонние привязки: для Eigen я нашел minieigen ; для Qt доступно PySide2 .

Вообще, как бы я использовал эти привязки, не написав свои собственные конвертеры для каждого типа? Например, рассмотрим следующее:

class Test
{
public:
    static double test(const Eigen::Vector3d& vector)
    {
        return vector.norm(); //just an example
    }
};

BOOST_PYTHON_MODULE(test)
{
    using namespace boost::python;
    scope classScope = class_<Test>("Test", no_init)
            .def("test", &Test::test)
            .staticmethod("test")
    ;
}

Завернуто так, код явно не работает:

>>> from test import Test
>>> import minieigen
>>> Test.test(minieigen.Vector3(0, 1, 2))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
    Test.test(Vector3)
did not match C++ signature:
    test(Eigen::Matrix<double, 3, 1, 0, 3, 1>)

Я понимаю, что проблема в том, что среда выполнения Boost.Python не проинформирована о типах, обернутых minieigen, поэтому я должен предоставить какой-то "клейкий код". Похоже, что Shiboken (для PySide2) предоставляет API только для этого ( этот вопрос имеет дело с этим, но он все еще смущает меня); однако, похоже, что у minieigen нет ничего подобного.

В прошлом я обнаружил многообещающий фрагмент кода, с помощью которого автор мог бы обернуть / развернуть основные указатели C ++ из PyObject, однако я не смог найти его снова ...

Я был бы признателен за аналогичную процедуру, позволяющую сэкономить на переносе каждого стороннего типа, используемого в нашей программе.

...