在C語言中,結構體(struct)指的是一種數據結構,是C語言中聚合數據類型(aggregate data type)的一類。結構體能夠被聲明爲變量、指針或數組等,用以實現較複雜的數據結構。結構體同時也是一些元素的集合,這些元素稱爲結構體的成員(member),且這些成員能夠爲不一樣的類型,成員通常用名字訪問。python
結構體、結構體指針做爲函數的參數應用的很是普遍,本文介紹如何使用pybind11封裝C++結構體做爲參數的函數。數組
student
的結構體,有5個成員變量name,Chinese,Mathematics,English和total
,構造函數經過name生成實例,成員函數setName
能夠給實例的name賦值;calc
函數接收一個student實例做爲參數,經過三門課程的分數計算出總分total
;abctest
)中。//文件名:whjy.h #include <string> 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&);
//文件名:func.cpp #include "whjy.h" #include <string> void calc(struct student& tyh){ tyh.total = tyh.Chinese + tyh.Mathematics + tyh.English; }
//文件名:func_wrapper.cpp #include <pybind11/pybind11.h> #include "whjy.h" namespace py = pybind11; PYBIND11_MODULE(abctest, m){ m.doc() = "simple example"; py::class_<student>(m, "student") .def(py::init<string>()) .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); }
#文件名: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 + ":" + str(s.total) + "分") print("----------------------") s.setName("小紅") print(s.name + ":" + str(s.total) + "分")
output:
小明:330分
----------------------
小紅:330分
app