Добавить конструктор в открытый класс boost :: python vector_indexing_suite - PullRequest
1 голос
/ 31 мая 2011

Я хотел бы добавить конструктор, чтобы я мог это сделать (мои байты в строках, потому что я использую 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<...>), поэтому представляется целесообразным использовать это для выбора целых векторов в один раз, вместо того, чтобы позволить питону независимо выбирать каждый элемент 1 .

1 и, скорее всего, это будет высокопроизводительное решение

1 Ответ

1 голос
/ 31 мая 2011

Я не думаю, что использование 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, описанным в ссылке.

...