Boost Python官方样例(三)
导出C++类(纯虚函数和虚函数)
大致做法就是为class写一个warp,通过get_override方法检测虚函数是否被重载了,如果被重载了调用重载函数,否则调用自身实现,最后导出的时候直接导出warp类,但是类名使用class,析构函数不需要导出,因为它会被自动调用
纯虚函数
编写C++函数实现
$ vim virt.h
#include <iostream>
#include <boost/python/wrapper.hpp>
// 用class会出现编译问题, 不知道是不是和boost::python里面的class产生了冲突
struct Base
{
    virtual ~Base() { std::cout << "Base destructor" << std::endl; };
    virtual int f() = 0;
};
struct BaseWrap : Base, boost::python::wrapper<Base>
{
    int f()
    {
        return this->get_override("f")();
    }
};
编写Boost.Python文件
$ vim virt_wrapper.cpp
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/python/pure_virtual.hpp>
#include "virt.h"
using namespace boost::python;
using namespace boost::python::detail;
BOOST_PYTHON_MODULE_INIT(virt_ext)
{
    class_<BaseWrap, boost::noncopyable>("Base")
            .def("f", pure_virtual(&Base::f));
}
运行python测试库文件
$ python
>>> import virt_ext
>>> def f():
...     o = virt_ext.Base()
...
>>> f()
Base destructor
虚函数
编写C++函数实现
$ vim virt.h
#include <boost/python/wrapper.hpp>
#include <boost/python/call.hpp>
struct Base
{
    virtual ~Base() { std::cout << "Base destructor" << std::endl; };
    virtual int f() = 0;
};
struct BaseWrap : Base, boost::python::wrapper<Base>
{
    int f()
    {
        return this->get_override("f")();
    }
};
struct Derived: Base
{
    virtual ~Derived() { std::cout << "Derived destructor" << std::endl; }
    virtual int f() { std::cout << "Override by Derived" << std::endl; return 0; }
};
struct DerivedWrap : Derived, boost::python::wrapper<Derived>
{
    int f()
    {
        if (boost::python::override func = this->get_override("f"))
            return func();
        return Derived::f();
    }
};
编写Boost.Python文件
$ vim virt_wrapper.cpp
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/python/pure_virtual.hpp>
#include "virt.h"
using namespace boost::python;
using namespace boost::python::detail;
BOOST_PYTHON_MODULE_INIT(virt_ext)
{
// 可以导出Base也可以不导出Base
//    class_<BaseWrap, boost::noncopyable>("Base")
//            .def("f", pure_virtual(&Base::f));
    class_<DerivedWrap, boost::noncopyable>("Derived")
            .def("f", &Derived::f);
}
运行python测试库文件
>>> import virt_ext
>>> b = virt_ext.Base()
>>> d = virt_ext.Derived()
>>> d.f()
Override by Derived
0
>>> b.f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: Pure virtual function called
>>> exit()
Base destructor
Derived destructor
Base destructor
												
											Boost Python官方样例(三)的更多相关文章
- Boost Python官方样例(二)
		
返回值 使用return_by_value有点像C++ 11的auto关键字,可以让模板自适应返回值类型(返回值类型必须是要拷贝到新的python对象的任意引用或值类型),可以使用return_by_ ...
 - Boost Python官方样例(一)
		
配置环境 $ cat /etc/os-release NAME="Ubuntu" VERSION="16.04 LTS (Xenial Xerus)" ID=u ...
 - Python word_cloud 样例 标签云系列(三)
		
转载地址:https://zhuanlan.zhihu.com/p/20436642word_cloud/examples at master · amueller/word_cloud · GitH ...
 - Python代码样例列表
		
扫描左上角二维码,关注公众账号 数字货币量化投资,回复“1279”,获取以下600个Python经典例子源码 ├─algorithm│ Python用户推荐系统曼哈顿算法实现.py│ ...
 - gtk+3.0的环境配置及基于gtk+3.0的python简单样例
		
/********************************************************************* * Author : Samson * Date ...
 - ShardingSphere 知识库更新 | 官方样例集助你快速上手
		
Apache ShardingSphere 作为 Apache 顶级项目,是数据库领域最受欢迎的开源项目之一.经过 5 年多的发展,ShardingSphere 已获得超 14K Stars 的关注, ...
 - Boost Python学习笔记(三)
		
你将学到什么 在C++中调用Python代码时的传参问题 基础类型 继续使用前面的项目,但是先修改下Python脚本(zoo.py),添加Add和Str函数,分别针对整数.浮点数和字符串参数的测试 d ...
 - [b0011] windows 下 eclipse 开发 hdfs程序样例 (三)
		
目的: 学习windows 开发hadoop程序的配置. [b0007] windows 下 eclipse 开发 hdfs程序样例 太麻烦 [b0010] windows 下 eclipse 开发 ...
 - 维特比算法(Viterbi)及python实现样例
		
维特比算法(Viterbi) 维特比算法 维特比算法shiyizhong 动态规划算法用于最可能产生观测时间序列的-维特比路径-隐含状态序列,特别是在马尔可夫信息源上下文和隐马尔科夫模型中.术语“维特 ...
 
随机推荐
- codevs1281 Xn数列
			
题目描述 Description 给你6个数,m, a, c, x0, n, g Xn+1 = ( aXn + c ) mod m,求Xn m, a, c, x0, n, g<=10^18 输入 ...
 - mysql查看和设置timeout 和批量杀死链接进程
			
查看的语句 show global variables like "%timeout%"; 结果: +-----------------------------+--------- ...
 - Java的TCP网络编程
			
服务端代码: package socket; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...
 - Android Studio Mac版快捷键
			
mac上按键符号 ⌥ : option / alt ⇧ : shift ⌃ : control ⌘ : command ⎋ : esc (一)查找/查看相关 搜索任意内容 双击 sft 当前文件查找/ ...
 - MySQL常用方法
			
1.INSTR,例:INSTR(content,'\"SHOP_DES\"')>0,返回字符串在某一个字段的内容中第一次出现位置,没有为0 2.REPLACE,例:conte ...
 - linux应用之xampp集成环境的安装及配置(centos)
			
1.xampp集成环境的下载 在xampp的官网上选择对应系统的版本进行下载,官网地址:https://www.apachefriends.org/zh_cn/index.html #wget htt ...
 - Android 之 Matrix(转)
			
原文:http://www.cnblogs.com/qiengo/archive/2012/06/30/2570874.html#code Android Matrix Matrix的数学原理 平 ...
 - 2018.6.21 HOLTEK HT49R70A-1  Source Code analysis
			
Cange note: “Reading TMR1H will latch the contents of TMR1H and TMR1L counter to the destination”? F ...
 - JSTL标签提示:"items" does not support runtime expressions
			
今天在使用JSTL的 c:forEach 标签时,jsp提示:"items" does not support runtime expressions,后来才发现是因为taglib ...
 - git克隆某一个branch
			
git clone -b <branch> <remote_repo> 例如: git clone -b 指定的分支名字