2011-07-12 43 views
1

我正在使用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); 
}; 

回答

0
  1. 文檔涉及包裝虛函數,其可以進一步被覆蓋在python - 即在python類來自C++類派生。邏輯是這樣的,C++只能處理C++中的虛擬分辨率;如果它落在包裝類(你的python類派生的)上,this->get_override(..)將進一步查看python類是否覆蓋該特定函數。

    目前還不清楚這是否真的是你需要的(即從C++類派生python類)。如果你只想暴露常規的C++虛函數,虛擬分辨率是自動處理的。

  2. 此外,我不明白你的功能採取什麼樣的數據。你能舉一個更具體的例子嗎?如果你有想要在C++類中迭代的數據,定義特殊的Python函數__iter__,它將返回一個代理迭代器對象(你可以在C++中定義迭代器類並將其包裝在python中);此代理迭代器必須保持內部迭代狀態,並定義__iter__(返回自我),next(返回下一個容器項目),並在末尾引發StopIteraton。這是Python迭代協議和所有常見的結構(for等)將自動工作。 (參見例如here,對於一個示例迭代器類here

  3. (注)不傳遞vector<int>作爲參數,避免複製與const vector<int>&。來自python的vector<int>轉換器(如果你定義它們)將會工作得很好。

+0

感謝您的回覆。 1.是的,我想在python中重寫函數。雖然我意識到如果python中的接口與C++中的接口不同,可能會更簡單。 2.我編輯了我原來的帖子,希望有幫助嗎? 3.好主意,謝謝:) – babak

+0

即使界面不同,我認爲它是可行的。根據[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