我正在使用boost python創建一個綁定到C++庫。該庫中的許多類都具有接受iterator/const_iterator類型作爲參數的虛方法。我並不特別想公開這些類型,但寧願在接受適當容器的虛擬方法周圍創建一些包裝。我的問題是,在'默認實現'功能中做這個包裝是否安全?Boost python包裝虛擬方法
例如
class Test
{
public:
Test();
virtual ~Test();
virtual void iterate(std::vector<int>::iterator it);
};
然後用包裝類包裝默認..
struct Test_wrapper: Test, boost::python::wrapper<Test>
{
.....
virtual void iterate(std::vector<int>::iterator it);
void default_iterate(std::vector<int> it)
{
Test::iterate(it.begin());
}
};
,並建立與...結合
boost::python::class_<Test_wrapper>("Test")
.def("iterate" ,(void (Test_wrapper::*)(std::vector<int>))(&Test_wrapper::default_iterate));
我不能確定這一點,因爲教程說這兩個功能需要傳遞給'def',但只是通過一個似乎工作..(http://www.boost.org/doc/libs/1_43_0/libs/python/doc/tutorial/doc/html/python/exposing.html#python.class_virtual_functions)
任何意見與此將不勝感激。
在此先感謝,
巴巴克
編輯:
更具體地說,我想要綁定包含的方法「voxelToWorld」一類。此方法根據vsP/end中的點轉換wsP中的位置。我想包裝這個函數,使它的界面更加「pythonic」,但是我不確定正確的方法來做到這一點,同時它也是虛擬的。上您引用虛擬函數
class FieldMapping
{
public:
...
virtual void voxelToWorld(std::vector<V3d>::const_iterator vsP,
std::vector<V3d>::const_iterator end,
std::vector<V3d>::iterator wsP);
};
感謝您的回覆。 1.是的,我想在python中重寫函數。雖然我意識到如果python中的接口與C++中的接口不同,可能會更簡單。 2.我編輯了我原來的帖子,希望有幫助嗎? 3.好主意,謝謝:) – babak
即使界面不同,我認爲它是可行的。根據[wrapper docs](http://www.boost.org/doc/libs/1_43_0/libs/python/doc/v2/wrapper.html),'get_override'返回的是'None'或可調用的對象。你可以自己測試這個對象:如果'None',那麼這個函數在python中沒有被覆蓋,你應該調用C++函數(傳遞你喜歡的任何參數)。如果它不是'None',那麼它是一個可調用的python對象(綁定方法),你可以用爲python排列的參數來調用它。 – eudoxos