python函数参数类型可以是结构体吗_⽤pybind11封装C++结
构体作为参数的函数
Apple iPhone 11 (A2223) 128GB ⿊⾊ 移动联通电信4G⼿机 双卡双待
4999元包邮
去购买 >
在C语⾔中,结构体(struct)指的是⼀种数据结构,是C语⾔中聚合数据类型(aggregate data type)的⼀类。结构体可以被声明为变量、指针或数组等,⽤以实现较复杂的数据结构。结构体同时也是⼀些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员⼀般⽤名字访问。
结构体、结构体指针作为函数的参数应⽤的⾮常⼴泛,本⽂介绍如何使⽤pybind11封装C++结构体作为参数的函数。
⼀.需求分析
现有名为student的结构体,有5个成员变量name,Chinese,Mathematics,English和total,构造函数通过name⽣成实例,成员函数setName可以给实例的name赋值;
calc函数接收⼀个student实例作为参数,通过三门课程的分数计算出总分total;
将student,calc封装到包含⼀个student类和⼀个calc函数的python模块(abctest)中。
⼆.实现步骤
在头⽂件中定义student结构体,并声明calc函数;
在C++源⽂件中实现func.cpp函数;
编写pybind11封装函数;
⽤python编写setup脚本;
编译⽣成动态链接库;
测试函数功能。
三.代码实现
在头⽂件中定义student结构体,并声明calc函数
/
/⽂件名:whjy.h
#include
using namespace std;
struct student{
string name;
int Chinese;
int Mathematics;
int English;
int total;
student(string n){
this->name = n;
}
void setName(string stuName){
this->name = stuName;
}
};
void calc(struct student&);
在C++源⽂件中实现func.cpp函数
//⽂件名:func.cpp
#include "whjy.h"
#include
void calc(struct student& tyh){
编写pybind11封装函数
//⽂件名:func_wrapper.cpp
#include
#include "whjy.h"
namespace py = pybind11;
PYBIND11_MODULE(abctest, m){
m.doc() = "simple example";
py::class_(m, "student")
.def(py::init())
.def("setName", &student::setName)
.
def_readonly("name", &student::name)
.def_readwrite("Chinese", &student::Chinese)
.def_readwrite("Mathematics", &student::Mathematics) .def_readwrite("English", &student::English)
.def_readwrite("total", &student::total);
m.def("calc", &calc);
}
⽤python编写setup脚本
#⽂件名:setup.py
from setuptools import setup, Extension
functions_module = Extension(
name = 'abctest',
sources = ['func.cpp', 'func_wrapper.cpp'],
结构体数组不能作为参数传递给函数include_dirs = [r'D:\software\pybind11-master\include',
r'D:\software\Anaconda\include']
)
setup(ext_modules = [functions_module])
编译⽣成动态链接库
在命令⾏执⾏python setup.py build_ext --inplace,在当前路径下⽣成pyd动态库。测试函数功能
#⽂件名:test.py
import abctest
s = abctest.student("⼩明")
s.Chinese = 100
s.Mathematics = 110
s.English =120
abctest.calc(s)
print(s.name + ":" + al) + "分")
print("----------------------")
s.setName("⼩红")
print(s.name + ":" + al) + "分")
output:
⼩明:330分
----------------------
⼩红:330分
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论