Добавьте конструктор в открытый класс boost ::python vector_indexing_suite

#boost-python

#boost-python

Вопрос:

Я хотел бы добавить конструктор, чтобы я мог это сделать (мои байты находятся в строках, потому что я использую python 2.6 и 2.7):

 import myboostpymodule

d = 'serialised representation of a vector of some c   objects'

vec = myboostpymodule.MyVectorType(d)
  

Где я перегружаю векторный конструктор, чтобы принять строку, которая будет содержать сериализованные данные, и MyVectorType отображается с помощью boost::python::vector_indexing_suite :

 namespace bp = boost::python;
bp::class_< std::vector<SomeType> >("MyVectorType")
    .def(bp::vector_indexing_suite< std::vector<SomeType> >());
  
  • Возможно ли это сделать без переноса (с помощью подклассов и boost::python::wrapper<…>) вектора для добавления конструктора?
  • Могу ли я указать boost python использовать статический метод (или обычную функцию) в качестве конструктора?

Важно, что я могу создавать векторы из python, используя конструктор (а не какую-либо другую функцию).

На самом деле я делаю это, потому что я хотел бы сделать экземпляры моих векторов на python доступными для выбора, и все мои типы c уже имеют четко определенную сериализацию (включая std::vector<...> ), поэтому кажется разумным использовать это для выбора целых векторов сразу, вместо того, чтобы позволять python выбирать каждый элемент независимо1.

1и, похоже, это будет более производительное решение

Ответ №1:

Я не думаю, что использование boost::python::wrapper поможет вам, поскольку вам нужно будет использовать конструктор. Я посмотрел на boost::python::vector_indexing_suite определение и думаю, что вы действительно можете определить свой собственный конструктор.

В boost::python есть функция для указания ваших собственных именованных конструкторов. Обычно он используется для реализации заводских функций, которые возвращают shared_ptr , но выглядят как обычные конструкторы из python. Вы можете посмотреть на http://wiki.python.org/moin/boost.python/HowTo#named_constructors_.2BAC8_factories_.28as_Python_initializers.29 вот пример этого.

Если копирование вашего списка не является дорогостоящим, я думаю, вы можете просто сделать это:

 using boost::python;
typedef std::vector<SomeType> MyVectorType;

MyVectorType makeMyVector(std::string myString)
{
    return CreateMyVectorType(myString);
}


class_<MyVectorType>("MyVectorType")
    .def(vector_indexing_suite<MyVectorType>())
    .def("__init__", make_constructor(makeMyVector));
  

Однако, если копирование обходится дорого, вы должны иметь возможность объединить его с подходом shared_ptr factory, описанным в ссылке.

Комментарии:

1. Спасибо; оказывается, для этого в любом случае make_constructor(...) требуется что-то, что возвращает shared_ptr подобный объект.