【问题标题】:Boost python wrapping a virtual methodBoost python包装一个虚拟方法
【发布时间】:2011-10-03 20:43:45
【问题描述】:

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

例如

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);
};

【问题讨论】:

    标签: c++ python boost-python virtual-functions


    【解决方案1】:
    1. 您引用的有关虚函数的文档与包装虚函数有关,这些虚函数可以在 python 中进一步覆盖——即在派生自 c++ 类的 python 类中。逻辑是这样的,c++ 只处理 c++ 中的虚拟分辨率;如果它落在包装类(您的 python 类从中派生)上,this-&gt;get_override(..) 将进一步查看 python 类是否覆盖该特定函数。

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

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

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

    【讨论】:

    • 感谢您的回复。 1. 是的,我希望在 python 中重写该函数。尽管我意识到,如果 python 中的接口与 c++ 中的接口不同,那可能就不那么简单了。 2. 我已经编辑了我的原始帖子,希望对您有帮助吗? 3. 好主意,谢谢:)
    • 我认为即使界面不同也是可行的。根据wrapper docsget_override 返回的对象是None 或可调用对象。你可以自己测试这个对象:如果None,那么这个函数在python中没有被覆盖,你应该调用c++(传递你喜欢的任何参数);如果不是None,那么它是一个可调用的python对象(绑定方法),你可以用为python安排的参数来调用它。
    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 2011-01-17
    • 2011-03-10
    • 2018-11-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2019-01-20
    相关资源
    最近更新 更多