Boost python包装虚拟方法

2024-09-27 21:32:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用boostpython创建一个到c++库的绑定。此库中的许多类具有接受迭代器/常量迭代器类型作为参数的虚拟方法。我并不特别想公开这些类型,但我更愿意围绕这些接受适当容器的虚拟方法创建一些包装器。我的问题是,在“默认实现”函数中进行这种包装是否安全?在

例如

class Test
{
public:
    Test();
    virtual ~Test();
    virtual void iterate(std::vector<int>::iterator it);
};

然后用包装器类包装默认值。。在

^{pr2}$

设置绑定。。。在

boost::python::class_< Test_wrapper >("Test")    
    .def("iterate" ,(void ( Test_wrapper::* )(std::vector<int>))(&Test_wrapper::default_iterate));

我不确定这一点,因为教程中说需要将两个函数传递给“def”,但传递一个似乎可以。。(^ a1)

如有任何建议,我们将不胜感激。
提前感谢,
巴巴克

编辑
更具体地说,我试图绑定一个包含方法“voxelToWorld”的类。该方法基于vsP/end中的点来转换wsP中的位置。我想把这个函数包装起来,这样它的接口就更“python”了,但是我不确定在把它虚拟化的同时,我也不确定该怎么做。在

class FieldMapping
{
 public:
 ...
 virtual void voxelToWorld(std::vector<V3d>::const_iterator vsP, 
                           std::vector<V3d>::const_iterator end, 
                           std::vector<V3d>::iterator wsP);
};

Tags: 方法函数test类型virtualpublicwrapperclass
1条回答
网友
1楼 · 发布于 2024-09-27 21:32:29
  1. 关于您所引用的虚拟函数的文档与包装虚拟函数有关,这些虚拟函数可以在python中进一步重写,也就是在从c++类派生的python类中。逻辑是这样的:c++只处理c++中的虚拟解析;如果它位于包装器类(python类从中派生)上,this->get_override(..)将进一步检查python类是否覆盖了该特定函数。在

    不清楚这是否真的是您所需要的(即从c++类派生python类)。如果您只想公开常规的c++虚拟函数,则会自动处理虚拟解析。

  2. 而且,我不知道你的函数需要什么样的数据。你能举一个更具体的例子吗?如果您已经在c++类中有要迭代的数据,请定义特殊的python函数__iter__,它将返回一个代理迭代器对象(您在c++中定义迭代器类并用python包装它);这个代理迭代器必须保持内部迭代状态并定义__iter__(返回self),next(返回下一个容器项),并在末尾引发stopiration。这就是python迭代协议,所有常用的构造(for等)都将自动工作。(示例请参见here,迭代器类here

  3. (备注)不要将vector<int>作为参数传递,避免使用const vector<int>&进行复制。来自python的vector<int>的转换器(如果您定义了它们)将可以正常工作。

相关问题 更多 >

    热门问题