2011-05-31 89 views
0

我想添加一個構造函數,因此我可以做到這一點(我的字節字符串中,因爲我使用的Python 2.6和2.7):構造函數添加到一個boost ::蟒蛇vector_indexing_suite暴露類

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> >()); 
  • 是否有可能做到這一點沒有包裹(通過子類化和噓聲st :: python :: wrapper < ...>)添加構造函數的向量?
  • 我可以告訴boost python使用靜態方法(或普通函數)作爲構造函數嗎?

重要的是我可以使用構造函數(而不是其他函數)從python創建向量。

我其實這樣做是因爲我想使我的向量的蟒蛇實例與pickle,以及所有我的C++類型已經有明確定義的序列化(包括std::vector<...>),所以它似乎是合理使用這一次醃製整個載體,而不是允許python獨立地醃製每個元素。

,它很可能是一個更高性能的解決方案

回答

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的工廠方針結合起來。

+0

謝謝;事實證明'make_constructor(...)'在任何情況下都需要返回一個'shared_ptr'對象。 – James 2011-05-31 21:26:38