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