亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么使用pybind11封裝C++結構體作為參數的函數

發布時間:2021-05-24 11:24:49 來源:億速云 閱讀:347 作者:小新 欄目:編程語言

這篇文章主要介紹怎么使用pybind11封裝C++結構體作為參數的函數,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

python調用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,這些方法有繁有簡,而pybind11的優點是對C++ 11支持很好,API比較簡單,現在我們就簡單記下Pybind11的入門操作。

pybind11簡介

pybind11是一個輕量級的只包含頭文件的庫,它主要是用來在已有的 C++代碼的基礎上做擴展,它的語法和目標非常像Boost.Python,但Boost.Python為了兼容現有的基本所有的C++編譯器而變得非常復雜和龐大,而因此付出的代價是很多晦澀的模板技巧以及很多不必要的對舊版編譯器的支持。Pybind11摒棄了這些支持,它只支持python2.7以上以及C++ 11以上的編譯器,使得它比Boost.Python更加簡潔高效。

在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 )中。

二.實現步驟

  1. 在頭文件中定義student結構體,并聲明calc函數;

  2. 在C++源文件中實現func.cpp函數;

  3. 編寫pybind11封裝函數;

  4. 用python編寫setup腳本;

  5. 編譯生成動態鏈接庫;

  6. 測試函數功能。

三.代碼實現

在頭文件中定義student結構體,并聲明calc函數

//文件名: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&);

在C++源文件中實現func.cpp函數

//文件名:func.cpp
#include "whjy.h" 
#include <string> 
void calc(struct student& tyh){ 
 tyh.total = tyh.Chinese + tyh.Mathematics + tyh.English; 
}

編寫pybind11封裝函數

//文件名: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); 
}

用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 + ":" + str(s.total) + "分") 
print("----------------------") 
s.setName("小紅") 
print(s.name + ":" + str(s.total) + "分")

output:
小明:330分
----------------------
小紅:330分

以上是“怎么使用pybind11封裝C++結構體作為參數的函數”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

九江市| 万年县| 无极县| 垣曲县| 青海省| 隆安县| 山丹县| 游戏| 凤阳县| 玉门市| 若羌县| 冀州市| 江源县| 宁安市| 页游| 乌什县| 河间市| 昌都县| 德保县| 博罗县| 满城县| 汉寿县| 浦东新区| 铜川市| 资兴市| 清徐县| 新干县| 仲巴县| 北辰区| 吉首市| 满洲里市| 襄樊市| 墨竹工卡县| 建德市| 揭东县| 洛隆县| 巍山| 达日县| 卢龙县| 宁武县| 尚义县|