问题描述
||
我想添加一个构造函数以便执行此操作(我的字节为字符串,因为我使用的是python 2.6和2.7):
import myboostpymodule
d = \'serialised representation of a vector of some c++ objects\'
vec = myboostpymodule.MyVectorType(d)
我在哪里重载了向量构造函数以接受一个字符串,该字符串将包含序列化的数据,而MyVectorType用ѭ1公开:
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,这似乎是一个性能更高的解决方案
解决方法
我认为使用ѭ4不会帮助您,因为您需要使用构造函数。我查看了
boost::python::vector_indexing_suite
的定义,我认为您实际上可以定义自己的构造函数。
boost :: python中有一个函数可以指定您自己的命名构造函数。它通常用于实现返回ѭ6的工厂函数,但看起来像来自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工厂方法结合使用。