c – Boost包装虚拟方法的python
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c – Boost包装虚拟方法的python,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2165字,纯文字阅读大概需要4分钟。
内容图文
我正在使用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);
};
解决方法:
>你引用的虚函数的文档与包装虚函数有关,虚函数可以在python中进一步覆盖 – 即在派生自c类的python类中.逻辑是c只处理c中的虚拟分辨率;如果它落在包装类(你的python类派生自派生类)上,那么这个> get_override(..)将进一步查看python类是否覆盖了该特定函数.
目前尚不清楚这是否真的是你需要的(即从c类派生python类).如果您只想公开常规c虚函数,则会自动处理虚拟分辨率.
>此外,我不明白您的功能采用何种数据.你能举个更具体的例子吗?如果你想要在c类中迭代数据,请定义特殊的python函数__iter__,它将返回一个代理迭代器对象(你在c中定义迭代器类并将其包装在python中);此代理迭代器必须保持内部迭代状态并定义__iter__(返回self),next(返回下一个容器项),并在结尾处引发StopIteraton.这就是python迭代协议,所有常用的构造(对于etc)都将自动运行. (例如,参见here,迭代器类here)
>(备注)不传递vector< int>作为参数,避免使用const向量< int>&进行复制.矢量转换器< int>从python(如果你定义它们)将工作得很好.
内容总结
以上是互联网集市为您收集整理的c – Boost包装虚拟方法的python全部内容,希望文章能够帮你解决c – Boost包装虚拟方法的python所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。