#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
подобный объект.