pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

我應該在 C++ 中使用 std::function 還是函數指針?

Should I use std::function or a function pointer in C++?(我應該在 C++ 中使用 std::function 還是函數指針?)
本文介紹了我應該在 C++ 中使用 std::function 還是函數指針?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

在C++中實現回調函數時,我是否還應該使用C風格的函數指針:

When implementing a callback function in C++, should I still use the C-style function pointer:

void (*callbackFunc)(int);

或者我應該使用 std::function:

Or should I make use of std::function:

std::function< void(int) > callbackFunc;

推薦答案

簡而言之,除非有理由不使用,否則請使用 std::function.

函數指針的缺點是不能捕獲某些上下文.例如,您將無法將 lambda 函數作為捕獲某些上下文變量的回調傳遞(但如果它不捕獲任何上下文變量,它將起作用).因此,調用對象的成員變量(即非靜態)也是不可能的,因為需要捕獲對象(this-pointer).(1)

Function pointers have the disadvantage of not being able to capture some context. You won't be able to for example pass a lambda function as a callback which captures some context variables (but it will work if it doesn't capture any). Calling a member variable of an object (i.e. non-static) is thus also not possible, since the object (this-pointer) needs to be captured.(1)

std::function(自 C++11 起)主要用于存儲一個函數(傳遞它不需要存儲它).因此,如果您想將回調存儲在例如成員變量中,這可能是您的最佳選擇.而且如果你不存儲它,它也是一個不錯的首選"盡管它的缺點是在調用時引入了一些(非常小的)開銷(因此在非常關鍵的性能情況下它可能是一個問題,但在大多數情況下它不應該).它非常通用":如果您非常關心一致和可讀的代碼,并且不想考慮您所做的每一個選擇(即想要保持簡單),請使用 std::function 對于您傳遞的每個函數.

std::function (since C++11) is primarily to store a function (passing it around doesn't require it to be stored). Hence if you want to store the callback for example in a member variable, it's probably your best choice. But also if you don't store it, it's a good "first choice" although it has the disadvantage of introducing some (very small) overhead when being called (so in a very performance-critical situation it might be a problem but in most it should not). It is very "universal": if you care a lot about consistent and readable code as well as don't want to think about every choice you make (i.e. want to keep it simple), use std::function for every function you pass around.

考慮第三種選擇:如果您要實現一個小函數,然后通過提供的回調函數報告某些內容,請考慮一個模板參數,它可以是任何可調用的對象,即一個函數指針,一個函子,一個 lambda,一個 std::function,......這里的缺點是你的(外部)函數變成了一個模板,因此需要在標題中實現.另一方面,您可以獲得可以內聯回調調用的優勢,因為您的(外部)函數的客戶端代碼看到"了對回調的調用將提供可用的確切類型信息.

Think about a third option: If you're about to implement a small function which then reports something via the provided callback function, consider a template parameter, which can then be any callable object, i.e. a function pointer, a functor, a lambda, a std::function, ... Drawback here is that your (outer) function becomes a template and hence needs to be implemented in the header. On the other hand you get the advantage that the call to the callback can be inlined, as the client code of your (outer) function "sees" the call to the callback will the exact type information being available.

帶有模板參數的版本示例(對于 pre-C++11,編寫 & 而不是 &&):

Example for the version with the template parameter (write & instead of && for pre-C++11):

template <typename CallbackFunction>
void myFunction(..., CallbackFunction && callback) {
    ...
    callback(...);
    ...
}


如下表所示,它們各有優缺點:


As you can see in the following table, all of them have their advantages and disadvantages:

<頭>
函數ptrstd::function模板參數
可以捕獲上下文變量no1
沒有調用開銷(見評論)no
可以內聯(見評論)nono
可以存放在一個類成員中no2
可以在header之外實現no
不支持 C++11 標準no3
可讀性很好(我認為)no(是)


(1) 存在克服此限制的解決方法,例如將附加數據作為進一步的參數傳遞給您的(外部)函數:myFunction(..., callback, data) 將調用 callback(data).這是 C 風格的帶參數回調",這在 C++ 中是可能的(順便說一下,在 WIN32 API 中大量使用)但應該避免,因為我們在 C++ 中有更好的選擇.


(1) Workarounds exist to overcome this limitation, for example passing the additional data as further parameters to your (outer) function: myFunction(..., callback, data) will call callback(data). That's the C-style "callback with arguments", which is possible in C++ (and by the way heavily used in the WIN32 API) but should be avoided because we have better options in C++.

(2) 除非我們談論的是類模板,即存儲函數的類是模板.但這意味著在客戶端,函數的類型決定了存儲回調的對象的類型,這在實際用例中幾乎從來不是一個選項.

(3) 對于 C++11 之前的版本,使用 boost::function

這篇關于我應該在 C++ 中使用 std::function 還是函數指針?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

How can I read and manipulate CSV file data in C++?(如何在 C++ 中讀取和操作 CSV 文件數據?)
In C++ why can#39;t I write a for() loop like this: for( int i = 1, double i2 = 0; (在 C++ 中,為什么我不能像這樣編寫 for() 循環: for( int i = 1, double i2 = 0;)
How does OpenMP handle nested loops?(OpenMP 如何處理嵌套循環?)
Reusing thread in loop c++(在循環 C++ 中重用線程)
Precise thread sleep needed. Max 1ms error(需要精確的線程睡眠.最大 1ms 誤差)
Is there ever a need for a quot;do {...} while ( )quot; loop?(是否需要“do {...} while ()?環形?)
主站蜘蛛池模板: 光照全温振荡器(智能型)-恒隆仪器 | 元拓建材集团官方网站 | 深圳VI设计-画册设计-LOGO设计-包装设计-品牌策划公司-[智睿画册设计公司] | 螺杆真空泵_耐腐蚀螺杆真空泵_水环真空泵_真空机组_烟台真空泵-烟台斯凯威真空 | 工业车间焊接-整体|集中除尘设备-激光|等离子切割机配套除尘-粉尘烟尘净化治理厂家-山东美蓝环保科技有限公司 | 艺术生文化课培训|艺术生文化课辅导冲刺-济南启迪学校 | 卸料器-卸灰阀-卸料阀-瑞安市天蓝环保设备有限公司 | 涿州网站建设_网站设计_网站制作_做网站_固安良言多米网络公司 | SPC工作站-连杆综合检具-表盘气动量仪-内孔缺陷检测仪-杭州朗多检测仪器有限公司 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 软文发布-新闻发布推广平台-代写文章-网络广告营销-自助发稿公司媒介星 | 上海洗地机-洗地机厂家-全自动洗地机-手推式洗地机-上海滢皓洗地机 | 薪动-人力资源公司-灵活用工薪资代发-费用结算-残保金优化-北京秒付科技有限公司 | 吹塑加工_大型吹塑加工_滚塑代加工-莱力奇吹塑加工有限公司 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | MES系统-WMS系统-MES定制开发-制造执行MES解决方案-罗浮云计算 | 山东led显示屏,山东led全彩显示屏,山东LED小间距屏,临沂全彩电子屏-山东亚泰视讯传媒有限公司 | 瓶盖扭矩测试仪-瓶盖扭力仪-全自动扭矩仪-济南三泉中石单品站 | 变频器维修公司_plc维修_伺服驱动器维修_工控机维修 - 夫唯科技 变位机,焊接变位机,焊接变位器,小型变位机,小型焊接变位机-济南上弘机电设备有限公司 | 工业设计,人工智能,体验式3D展示的智能技术交流服务平台-纳金网 J.S.Bach 圣巴赫_高端背景音乐系统_官网 | 自动售货机_无人售货机_专业的自动售货机运营商_免费投放售货机-广州富宏主官网 | 开平机_纵剪机厂家_开平机生产厂家|诚信互赢-泰安瑞烨精工机械制造有限公司 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 帽子厂家_帽子工厂_帽子定做_义乌帽厂_帽厂_制帽厂 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 北京印刷厂_北京印刷_北京印刷公司_北京印刷厂家_北京东爵盛世印刷有限公司 | 珠海冷却塔降噪维修_冷却塔改造报价_凉水塔风机维修厂家- 广东康明节能空调有限公司 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 智慧旅游_智慧景区_微景通-智慧旅游景区解决方案提供商 | 透平油真空滤油机-变压器油板框滤油机-滤油车-华之源过滤设备 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 吉祥新世纪铝塑板_生产铝塑板厂家_铝塑板生产厂家_临沂市兴达铝塑装饰材料有限公司 | 密集架|电动密集架|移动密集架|黑龙江档案密集架-大量现货厂家销售 | 法兰螺母 - 不锈钢螺母制造厂家 - 万千紧固件--螺母街 | 数控走心机-走心机价格-双主轴走心机-宝宇百科 | 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 |