导出C++类(纯虚函数和虚函数)

大致做法就是为class写一个warp,通过get_override方法检测虚函数是否被重载了,如果被重载了调用重载函数,否则调用自身实现,最后导出的时候直接导出warp类,但是类名使用class,析构函数不需要导出,因为它会被自动调用

纯虚函数

编写C++函数实现

  1. $ vim virt.h
  2. #include <iostream>
  3. #include <boost/python/wrapper.hpp>
  4. // 用class会出现编译问题, 不知道是不是和boost::python里面的class产生了冲突
  5. struct Base
  6. {
  7. virtual ~Base() { std::cout << "Base destructor" << std::endl; };
  8. virtual int f() = 0;
  9. };
  10. struct BaseWrap : Base, boost::python::wrapper<Base>
  11. {
  12. int f()
  13. {
  14. return this->get_override("f")();
  15. }
  16. };

编写Boost.Python文件

  1. $ vim virt_wrapper.cpp
  2. #include <boost/python/module.hpp>
  3. #include <boost/python/class.hpp>
  4. #include <boost/python/pure_virtual.hpp>
  5. #include "virt.h"
  6. using namespace boost::python;
  7. using namespace boost::python::detail;
  8. BOOST_PYTHON_MODULE_INIT(virt_ext)
  9. {
  10. class_<BaseWrap, boost::noncopyable>("Base")
  11. .def("f", pure_virtual(&Base::f));
  12. }

运行python测试库文件

  1. $ python
  2. >>> import virt_ext
  3. >>> def f():
  4. ... o = virt_ext.Base()
  5. ...
  6. >>> f()
  7. Base destructor

虚函数

编写C++函数实现

  1. $ vim virt.h
  2. #include <boost/python/wrapper.hpp>
  3. #include <boost/python/call.hpp>
  4. struct Base
  5. {
  6. virtual ~Base() { std::cout << "Base destructor" << std::endl; };
  7. virtual int f() = 0;
  8. };
  9. struct BaseWrap : Base, boost::python::wrapper<Base>
  10. {
  11. int f()
  12. {
  13. return this->get_override("f")();
  14. }
  15. };
  16. struct Derived: Base
  17. {
  18. virtual ~Derived() { std::cout << "Derived destructor" << std::endl; }
  19. virtual int f() { std::cout << "Override by Derived" << std::endl; return 0; }
  20. };
  21. struct DerivedWrap : Derived, boost::python::wrapper<Derived>
  22. {
  23. int f()
  24. {
  25. if (boost::python::override func = this->get_override("f"))
  26. return func();
  27. return Derived::f();
  28. }
  29. };

编写Boost.Python文件

  1. $ vim virt_wrapper.cpp
  2. #include <boost/python/module.hpp>
  3. #include <boost/python/class.hpp>
  4. #include <boost/python/pure_virtual.hpp>
  5. #include "virt.h"
  6. using namespace boost::python;
  7. using namespace boost::python::detail;
  8. BOOST_PYTHON_MODULE_INIT(virt_ext)
  9. {
  10. // 可以导出Base也可以不导出Base
  11. // class_<BaseWrap, boost::noncopyable>("Base")
  12. // .def("f", pure_virtual(&Base::f));
  13. class_<DerivedWrap, boost::noncopyable>("Derived")
  14. .def("f", &Derived::f);
  15. }

运行python测试库文件

  1. >>> import virt_ext
  2. >>> b = virt_ext.Base()
  3. >>> d = virt_ext.Derived()
  4. >>> d.f()
  5. Override by Derived
  6. 0
  7. >>> b.f()
  8. Traceback (most recent call last):
  9. File "<stdin>", line 1, in <module>
  10. RuntimeError: Pure virtual function called
  11. >>> exit()
  12. Base destructor
  13. Derived destructor
  14. Base destructor

Boost Python官方样例(三)的更多相关文章

  1. Boost Python官方样例(二)

    返回值 使用return_by_value有点像C++ 11的auto关键字,可以让模板自适应返回值类型(返回值类型必须是要拷贝到新的python对象的任意引用或值类型),可以使用return_by_ ...

  2. Boost Python官方样例(一)

    配置环境 $ cat /etc/os-release NAME="Ubuntu" VERSION="16.04 LTS (Xenial Xerus)" ID=u ...

  3. Python word_cloud 样例 标签云系列(三)

    转载地址:https://zhuanlan.zhihu.com/p/20436642word_cloud/examples at master · amueller/word_cloud · GitH ...

  4. Python代码样例列表

    扫描左上角二维码,关注公众账号 数字货币量化投资,回复“1279”,获取以下600个Python经典例子源码 ├─algorithm│       Python用户推荐系统曼哈顿算法实现.py│    ...

  5. gtk+3.0的环境配置及基于gtk+3.0的python简单样例

    /*********************************************************************  * Author  : Samson  * Date   ...

  6. ShardingSphere 知识库更新 | 官方样例集助你快速上手

    Apache ShardingSphere 作为 Apache 顶级项目,是数据库领域最受欢迎的开源项目之一.经过 5 年多的发展,ShardingSphere 已获得超 14K Stars 的关注, ...

  7. Boost Python学习笔记(三)

    你将学到什么 在C++中调用Python代码时的传参问题 基础类型 继续使用前面的项目,但是先修改下Python脚本(zoo.py),添加Add和Str函数,分别针对整数.浮点数和字符串参数的测试 d ...

  8. [b0011] windows 下 eclipse 开发 hdfs程序样例 (三)

    目的: 学习windows 开发hadoop程序的配置. [b0007] windows 下 eclipse 开发 hdfs程序样例 太麻烦 [b0010] windows 下 eclipse 开发 ...

  9. 维特比算法(Viterbi)及python实现样例

    维特比算法(Viterbi) 维特比算法 维特比算法shiyizhong 动态规划算法用于最可能产生观测时间序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔科夫模型中.术语“维特 ...

随机推荐

  1. 大话设计模式--职责连模式 Chain of Resposibility -- C++实现实例

    1. 职责链模式: 使多个对象都有机会处理请求,从而避免请求发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它. 当客户提交一个请求时,请求是沿着链传递直 ...

  2. Cocos2d-x中屏幕截取

    类似半屏幕文字向上滚动,到一定位置,逐渐消失 这里用到了CCLayer的visit()方法 首先新建一个类TxtLayer  继承CCLayer class TxtLayer : public coc ...

  3. Luogu P1463 [HAOI2007]反素数ant:数学 + dfs【反素数】

    题目链接:https://www.luogu.org/problemnew/show/P1463 题意: 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x ...

  4. 仿联想商城laravel实战---4、验证(lavarel的表单验证如何使用)

    仿联想商城laravel实战---4.验证(lavarel的表单验证如何使用) 一.总结 一句话总结: 验证规则和验证信息的数组:在控制器的方法中 1.注册页面中的用户名正确(比如是否重名,字段长度是 ...

  5. linux应用之yum命令的软件源的更换(centos)

    [1] 首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cent ...

  6. tomcat使用JDNI配置信息和使用信息。用于JDBC连接池

    JNDI: JNDI(java Naming and Directory Interface),java命名和目录接口.JNDI的作用就是:在服务器上配置资源,然后通过统一的方式来获取配置的资源 在t ...

  7. MySQL--Basic(二)

    USE db_name; CREATE DATABASE school; Use school; CREATE TABLE `StuInfo` ( `STU_ID` ) NOT NULL , `STU ...

  8. JSP--常用标签

    JSTL简介: JSTL是Java中的一个定制标签库集 实现了JSP页面中的代码复用,提高效率 可读性更强,方便前端查看与开发 环境搭建: JSTL标签和Servlet及JSP页面有比较严格的版本对应 ...

  9. django学习笔记(三)模型

    1.创建一个django app: python manage.py startapp books 2.validate 命令检查你的模型的语法和逻辑是否正确.一旦你觉得你的模型可能有问题,运行 py ...

  10. PS 滤镜——波浪 wave

    %%% Wave %%% 波浪效果 clc; clear all; close all; addpath('E:\PhotoShop Algortihm\Image Processing\PS Alg ...