返回值

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

返回常量对象引用

编写C++函数实现

$ vim ref.h
struct Bar { int x; }; struct Foo {
Foo(int x) { b.x = x; }
Bar const& get_bar() const { return b; }
private:
Bar b;
};

编写Boost.Python文件

$ vim ref_wrapper.cpp
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/python/copy_const_reference.hpp>
#include <boost/python/return_value_policy.hpp>
#include "ref.h" // Wrapper code
using namespace boost::python;
BOOST_PYTHON_MODULE(ref_ext)
{
class_<Bar>("Bar")
.def_readwrite("x", &Bar::x); class_<Foo>("Foo", init<int>())
.def("get_bar", &Foo::get_bar
, return_value_policy<copy_const_reference>());
}

运行python测试库文件

$ python
>>> import ref_ext
>>> f = ref_ext.Foo(2)
>>> b = f.get_bar()
>>> b.x
2

返回对象引用

编写C++函数实现

$ vim ref.cpp
struct Bar { int x; }; struct Foo {
Foo(int x) { b.x = x; }
Bar& get_bar() { return b; }
private:
Bar b;
};

编写Boost.Python文件

$ vim ref_wrapper.cpp
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>
#include <boost/python/copy_const_reference.hpp>
#include <boost/python/return_value_policy.hpp>
#include "ref.h" // Wrapper code
using namespace boost::python;
BOOST_PYTHON_MODULE(ref_ext)
{
class_<Bar>("Bar")
.def_readwrite("x", &Bar::x); class_<Foo>("Foo", init<int>())
.def("get_bar", &Foo::get_bar
, return_value_policy<copy_non_const_reference>());
}

运行python测试库文件

$ python
>>> import ref_ext
>>> f = ref_ext.Foo(3)
>>> b = f.get_bar()
>>> b.x
3

返回堆对象

编写C++函数实现

$ vim ref.h
#include <iostream> struct Foo {
Foo(int v) : x(v) {}
~Foo() { std::cout << "Foo destructor" << std::endl; }
int x;
}; Foo* make_foo(int x) { return new Foo(x); }

编写Boost.Python文件

$ vim ref_wrapper.cpp
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/args.hpp>
#include <boost/python/class.hpp>
#include <boost/python/manage_new_object.hpp>
#include <boost/python/return_value_policy.hpp>
#include "ref.h" // Wrapper code
using namespace boost::python;
BOOST_PYTHON_MODULE(ref_ext)
{
def("make_foo", make_foo, return_value_policy<manage_new_object>());
class_<Foo>("Foo", init<int>())
.def_readwrite("x", &Foo::x);
}

运行python测试库文件

$ python
>>> import ref_ext
>>> f = ref_ext.make_foo(3)
>>> f.x
3

返回静态对象

编写C++函数实现

$ vim ref.h
#include <utility> struct Singleton
{
Singleton() : x(0) {} int exchange(int n) // set x and return the old value
{
std::swap(n, x);
return n;
} int x;
}; Singleton& get_it()
{
static Singleton just_one;
return just_one;
}

编写Boost.Python文件

$ vim ref_wrapper.cpp
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
#include <boost/python/class.hpp>
#include <boost/python/reference_existing_object.hpp>
#include <boost/python/return_value_policy.hpp>
#include "ref.h" using namespace boost::python;
BOOST_PYTHON_MODULE(ref_ext)
{
def("get_it", get_it, return_value_policy<reference_existing_object>()); class_<Singleton>("Singleton")
.def("exchange", &Singleton::exchange);
}

运行python测试库文件

$ python
>>> import ref_ext
>>> s1 = ref_ext.get_it()
>>> s2 = ref_ext.get_it()
>>> id(s1) == id(s2)
False
>>> s1.exchange(42)
0
>>> s2.exchange(99)
42

枚举

创建工程目录

$ mkdir Lesson5
$ cd Lesson5

编写C++函数实现

$ vim enum.h
enum color { red = 1, green = 2, blue = 8 };

编写Boost.Python文件

$ vim enum_wrapper.cpp
#include <boost/python.hpp>
#include "enum.h" BOOST_PYTHON_MODULE(enum_ext)
{
using namespace boost::python;
enum_<color>("color")
.value("red", red)
.value("green", green)
.value("blue", blue);
}

为库编写CMakeLists.txt

$ vim CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
project(enum) ### 此处的动态库名必须和BOOST_PYTHON_MODULE()中定义的保持一致,即最后生成的库必须名为enum_ext.so
set(enumSRC enum_wrapper.cpp)
add_library(enum_ext SHARED ${enumSRC})
set_target_properties(enum_ext PROPERTIES PREFIX "") #dependencies
INCLUDE(FindPkgConfig)
pkg_check_modules(PYTHON REQUIRED python)
include_directories(/usr/include ${PYTHON_INCLUDE_DIRS})
target_link_libraries(enum_ext boost_python)

编译库

$ mkdir build
$ cd build
$ cmake ..
$ make

运行python测试库文件

### 在build目录下执行,即enum_ext.so存在的目录(可以将so移至其他目录,这样就可以在其他目录下打开python终端)
$ python
>>> import enum_ext
>>> help(enum_ext)
>>> enum_ext.color
<class 'enum_ext.color'>
>>> int(enum_ext.color.red)
1
>>> int(enum_ext.color.blue)
8

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

  1. Boost Python官方样例(三)

    导出C++类(纯虚函数和虚函数) 大致做法就是为class写一个warp,通过get_override方法检测虚函数是否被重载了,如果被重载了调用重载函数,否则调用自身实现,最后导出的时候直接导出wa ...

  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. gtk+3.0的环境配置及基于gtk+3.0的python简单样例

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

  5. Android利用Volley异步载入数据完整具体演示样例(二)

    MainActivity例如以下: package cc.y; import android.app.Activity; import android.content.Context; import ...

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

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

  7. Android清理设备内存具体完整演示样例(二)

    版权声明: https://blog.csdn.net/lfdfhl/article/details/27672913 MainActivity例如以下: package cc.c; import j ...

  8. Boost Python学习笔记(二)

    你将学到什么 如何在Python中调用C++代码 如何在C++中调用Python代码 在Python中调用C++代码 首先定义一个动物类(include/animal.h) #pragma once ...

  9. [b0010] windows 下 eclipse 开发 hdfs程序样例 (二)

    目的: 学习windows 开发hadoop程序的配置 相关: [b0007] windows 下 eclipse 开发 hdfs程序样例 环境: 基于以下环境配置好后. [b0008] Window ...

随机推荐

  1. HIVE- 数据倾斜

    数据倾斜就是由于数据分布不均匀,数据大量集中到一点上,造成数据热点.大多数情况下,分为一下三种情况: 1.map端执行比较快,reduce执行很慢,因为partition造成的数据倾斜. 2.某些re ...

  2. C++写和读文件

    1.写: /*C++写文件和读文件*/ #include <stdio.h> #include <stdlib.h> int main() { FILE * fp; fp = ...

  3. python再议装饰器

    装饰器实质还是一个函数,是对其他函数进行装饰的函数.装饰器函数接受被装饰函数的函数名,返回被装饰函数的函数名.对一个函数进行装饰有两个原则:一是不能修改被装饰函数的源代码:二是被装饰函数的调用方式不可 ...

  4. php数组转换成js可用的数组的两种方式

    1.如果你理解JSON数据格式的话,这个问题就异常简单: <?php $a =array('1','2','3'); ?> <script language="javasc ...

  5. Selenium-键盘操作

    在webdriver的Keys类中提供了键盘所有的按键操作,当然也包括一些常见的组合操作如Ctrl+A全选),Ctrl+C(复制),Ctrl+V(粘贴).更多参考官方文档对应的编码http://sel ...

  6. Dedecms丨显示指定的导航栏

    代码实例: {dede:channelartlist type='top' typeid='9,12,10' row='3' orderby='sortrank'}<li><a hr ...

  7. 【BZOJ 3238】差异 后缀自动机+树形DP

    题意 给定字符串,令$s_i$表示第$i$位开始的后缀,求$\sum_{1\le i < j \le n} len(s_i)+len(s_j)-2\times lcp(s_i,s_j)$ 先考虑 ...

  8. php-fpm进程内存泄漏

    线上服务器内存报警 线上web8G内存的服务器,内存几乎吃光,top查看,发现php-fpm进程每个都是几十M,php-fpm配置static, 一共150个 解决 排除过程中,其他机器相同配置都没有 ...

  9. MFC实现COM组件

    一般而言,ATL实现了对COM组件最好的支持,所以不用MFC实现COM组件.但是MFC实际上也是可以实现COM组件的. 一.MFC DLL优点: MFC com组件可以将MFC的类型作为参数进行传递, ...

  10. sqlite表结构动态读取工具(Chole ORM框架)

    Chole ORM框架 sqlIte于嵌入式数据库读取比较有利,不需要安装office也可以进行,可以在服务器系统当中使用. 所以我开发了这款工具,然后就是为了动态的读取表结构,然后根据表结构加载所有 ...