我正在使用boost python来创建对c ++库的绑定。该库中的许多类都有虚方法,它们接受iterator / const_iterator类型作为参数。我并不特别希望公开这些类型,但更愿意围绕这些接受适当容器的虚拟方法创建一些包装器。我的问题是,在“默认实现”功能中进行这种包装是否安全?
e.g。
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 :(得分:0)
您引用的虚函数的文档与包装虚函数有关,这些函数可以在python中进一步覆盖 - 即在派生自c ++类的python类中。逻辑是这样的,c ++只处理c ++中的虚拟分辨率;如果它落在包装类(你的python类派生自派生类)上,this->get_override(..)
将进一步查看python类是否覆盖该特定函数。
目前尚不清楚这是否真的是你需要的(即从c ++类派生python类)。如果您只想公开常规的c ++虚函数,则会自动处理虚拟解析。
此外,我不了解您的功能采用何种数据。你能举个更具体的例子吗?如果你想要在c ++类中迭代数据,请定义特殊的python函数__iter__
,它将返回一个代理迭代器对象(你在c ++中定义迭代器类并将它包装在python中);此代理迭代器必须保持内部迭代状态并定义__iter__
(返回self),next
(返回下一个容器项),并在结束时引发StopIteraton。这就是python迭代协议,所有常用的构造(for
等)都可以自动运行。 (例如,参见here,迭代器类here)
(备注)不要将vector<int>
作为参数传递,避免使用const vector<int>&
进行复制。来自python的vector<int>
转换器(如果你定义它们)可以正常工作。