2011-07-12 41 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