您的位置:首页 > 编程语言 > C语言/C++

Python调用采用Boost Python封装的c++(2)

2008-09-12 15:46 633 查看
上次我写了利用Python提供的API封装c函数,并调用。但是由于利用API的方式过于原始,对于类或者结构极度麻烦。因此,我选择了Boost的Python的来封装类,类似的工具还有SWIG等,选择Boost的原因是它不需要引入其他的接口描述语言,封装也是c++代码;另外,它支持的c++特性比较全。

Boost Python的文档,我推荐:http://www.maycode.com/boostdoc/boost-doc/libs/python/doc/。基本上,你遇到的问题,都可以找到答案。
下面贴一个例子,这个例子覆盖的面很全,需要好好理解。这个例子,是研究怎么封装C++。下一节,我会写一些高级的用法。

#include <boost/python.hpp>

#include <boost/python/module.hpp>

#include <boost/python/def.hpp>

#include <boost/python/to_python_converter.hpp>

#include

using namespace std;

using namespace boost::python;

namespace HelloPython{

// 简单函数

char const* sayHello(){

return "Hello from boost::python";

}

// 简单类

class HelloClass{

public:

HelloClass(const string& name):name(name){

}

public:

string sayHello(){

return "Hello from HelloClass by : " + name;

}

private:

string name;

};

// 接受该类的简单函数

string sayHelloClass(HelloClass& hello){

return hello.sayHello() + " in function sayHelloClass";

}

//STL容器

typedef vector<int> ivector;

//有默认参数值的函数

void showPerson(string name,int age=30,string nationality="China"){

cout << name << " " << age << " " << nationality << endl;

}

// 封装带有默认参数值的函数

BOOST_PYTHON_FUNCTION_OVERLOADS(showPerson_overloads,showPerson,1,3) //1:最少参数个数,3最大参数个数

// 封装模块

BOOST_PYTHON_MODULE(HelloPython){

// 封装简单函数

def("sayHello",sayHello);

// 封装简单类,并定义__init__函数

class_("HelloClass",init())

.def("sayHello",&HelloClass::sayHello)//Add a regular member function

;

def("sayHelloClass",sayHelloClass); // sayHelloClass can be made a member of module!!!

// STL的简单封装方法

class_("ivector")

.def(vector_indexing_suite());

class_ >("ivector_vector")

.def(vector_indexing_suite >());

// 带有默认参数值的封装方法

def("showPerson",showPerson,showPerson_overloads());

}


系列文章:
Python调用C/C++函数(1)
Python调用采用Boost Python封装的c++(2)
C++调用Python(3)
C++调用Python(4)
c++和Python互操作高级应用(5)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: