欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用pybind11封裝C++結(jié)構(gòu)體作為參數(shù)的函數(shù)實現(xiàn)步驟

 更新時間:2020年02月25日 09:29:04   作者:追憶  
這篇文章主要介紹了用pybind11封裝C++結(jié)構(gòu)體作為參數(shù)的函數(shù)實現(xiàn)步驟,本文分步驟通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

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

pybind11簡介

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

在C語言中,結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu),是C語言中聚合數(shù)據(jù)類型(aggregate data type)的一類。結(jié)構(gòu)體可以被聲明為變量、指針或數(shù)組等,用以實現(xiàn)較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)體同時也是一些元素的集合,這些元素稱為結(jié)構(gòu)體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。

結(jié)構(gòu)體、結(jié)構(gòu)體指針作為函數(shù)的參數(shù)應(yīng)用的非常廣泛,本文介紹如何使用pybind11封裝C++結(jié)構(gòu)體作為參數(shù)的函數(shù)。

一.需求分析

  • 現(xiàn)有名為 student 的結(jié)構(gòu)體,有5個成員變量 name,Chinese,Mathematics,English和total ,構(gòu)造函數(shù)通過name生成實例,成員函數(shù) setName 可以給實例的name賦值;
  • calc 函數(shù)接收一個student實例作為參數(shù),通過三門課程的分數(shù)計算出總分 total ;
  • 將student,calc封裝到包含一個student類和一個calc函數(shù)的python模塊( abctest )中。

二.實現(xiàn)步驟

  1. 在頭文件中定義student結(jié)構(gòu)體,并聲明calc函數(shù);
  2. 在C++源文件中實現(xiàn)func.cpp函數(shù);
  3. 編寫pybind11封裝函數(shù);
  4. 用python編寫setup腳本;
  5. 編譯生成動態(tài)鏈接庫;
  6. 測試函數(shù)功能。

三.代碼實現(xiàn)

在頭文件中定義student結(jié)構(gòu)體,并聲明calc函數(shù)

//文件名: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++源文件中實現(xiàn)func.cpp函數(shù)

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

編寫pybind11封裝函數(shù)

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

編譯生成動態(tài)鏈接庫

在命令行執(zhí)行 python setup.py build_ext --inplace ,在當前路徑下生成pyd動態(tài)庫。

測試函數(shù)功能

#文件名: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分

總結(jié)

到此這篇關(guān)于使用pybind11封裝C++結(jié)構(gòu)體作為參數(shù)的函數(shù)的實現(xiàn)步驟的文章就介紹到這了,更多相關(guān)pybind11封裝C++結(jié)構(gòu)體參數(shù)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中的static和const的關(guān)鍵字用法詳解

    C++中的static和const的關(guān)鍵字用法詳解

    這篇文章主要介紹了C++中的static和const的關(guān)鍵字用法詳解,這是一道經(jīng)常在面試中被問到的知識,本文給大家詳細介紹下,需要的朋友可以參考下
    2023-06-06
  • c++素數(shù)篩選法

    c++素數(shù)篩選法

    本文講的是篩選法的C++實現(xiàn), 篩選法又稱篩法,是求不超過自然數(shù)N(N&gt;1)的所有質(zhì)數(shù)的一種方法。據(jù)說是古希臘的埃拉托斯特尼(Eratosthenes,約公元前274~194年)發(fā)明的,又稱埃拉托斯特尼篩子。
    2017-05-05
  • C++算法之在無序數(shù)組中選擇第k小個數(shù)的實現(xiàn)方法

    C++算法之在無序數(shù)組中選擇第k小個數(shù)的實現(xiàn)方法

    這篇文章主要介紹了C++算法之在無序數(shù)組中選擇第k小個數(shù)的實現(xiàn)方法,涉及C++數(shù)組的遍歷、判斷、運算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-03-03
  • 淺析C++函數(shù)模板和類模板

    淺析C++函數(shù)模板和類模板

    C++語言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下
    2022-07-07
  • C語言中的運算符優(yōu)先級和結(jié)合性一覽表

    C語言中的運算符優(yōu)先級和結(jié)合性一覽表

    這篇文章主要介紹了C語言中的運算符優(yōu)先級和結(jié)合性一覽表,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++并查集常用操作

    C++并查集常用操作

    并查集 是一種樹型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相加集合的合并和查詢問題。本文給大家分享C++并查集常用操作及算法實現(xiàn),感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Qt中JSON使用的詳細步驟

    Qt中JSON使用的詳細步驟

    本文主要介紹了Qt中JSON使用的詳細步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • c++核心編程之函數(shù)的重載

    c++核心編程之函數(shù)的重載

    這篇文章主要介紹了c++核心編程之函數(shù)的重載,函數(shù)可以重復(fù)使用,提高了復(fù)用性,但前提是必須在一個作用域并且函數(shù)名稱相同,下面附代碼詳細介紹,需要的小伙伴可以參考一下
    2022-03-03
  • C語言變長數(shù)組使用詳解

    C語言變長數(shù)組使用詳解

    這篇文章主要介紹了C語言變長數(shù)組使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • C++基于棧的深搜算法實現(xiàn)馬踏棋盤

    C++基于棧的深搜算法實現(xiàn)馬踏棋盤

    這篇文章主要為大家詳細介紹了C++基于棧的深搜算法實現(xiàn)馬踏棋盤,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論