Конвертер для std :: vector при передаче по ссылке - PullRequest
2 голосов
/ 21 января 2012

Это дополнительный вопрос к std :: vector to boost :: python :: list

Я попробовал приведенный пример:

// C++ code
typedef std::vector<std::string> MyList;
class MyClass {
   MyList myFuncGet();
   void myFuncSet(MyList& list)
   {
      list.push_back("Hello");
   }
};

// My Wrapper code
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>

using namespace boost::python;

BOOST_PYTHON_MODULE(mymodule)
{
    class_<MyList>("MyList")
        .def(vector_indexing_suite<MyList>() );

    class_<myClass>("MyClass")
        .def("myFuncGet", &MyClass::myFuncGet)
        .def("myFuncSet", &MyClass::myFuncSet)
        ;
}

Но когда я пытаюсь использовать его в Python, я получаю сообщение об ошибке (см. Ниже).

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from mymoduleimport *
>>> mc = MyClass()
>>> p = []
>>> mc.myFuncSet(p)
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
Boost.Python.ArgumentError: Python argument types in
    MyClass.myFuncSet(MyClass, list)
did not match C++ signature:
myFuncSet(MyClass {lvalue}, std::vector<std::string, std::allocator<std::string> > {lvalue})

Из того, что я смог почерпнуть, читая различные другие сайты и посты, требуется конвертер. Может кто-нибудь завершить мой пример, добавив необходимый код конвертера? Я бы сделал это сам, но я недостаточно знаком с boost, чтобы знать, как выглядит такой конвертер.

Заранее спасибо!

1 Ответ

3 голосов
/ 21 января 2012

Я считаю, что вы можете использовать конвертеры только при передаче аргумента по значению или константной ссылке. Передача по неконстантной ссылке требует непосредственного предоставления типа. Это означает, что если вы хотите передать список с python на c ++, не копируя элементы списка, вам нужно изменить код для работы с boost::python::list вместо MyList, что будет что-то вроде (непроверенный )

void myFuncSet(boost::python::list& list)
{
   list.append("Hello");
}

Пакет векторной индексации добавляет список Python, похожий на поведение, в привязку MyList, но не позволяет передавать список Python вместо него.

Ошибка, которую вы получаете в своем примере, заключается в том, что вы пытаетесь передать список python функции, которая принимает std::vector<int>. Я подозреваю, что это будет работать

p = mc.myFuncGet()
mc.myFuncSet(p)

Это довольно полезная статья по написанию конвертеров. http://misspent.wordpress.com/2009/09/27/how-to-write-boost-python-converters/

...