一略板、std::bind包裝器/適配器介紹
? ? ?1眠菇、函數(shù)模版bind生成f的可調用函數(shù)對象包裝器边败,調用此包裝器等價于一些綁定到args的參數(shù)調用f。
? ? ?2捎废、可以用來將用戶提供的需要一個參數(shù)的函數(shù)轉換成不需要參數(shù)的函數(shù)對象放闺。綁定的值存儲在函數(shù)對象內并且會被自動傳遞給指定的函數(shù)
二、std::bind定義
?????template< class R, class F, class... Args >
?????bind( F&& f, Args&&... args );
? ? ?參數(shù)說明:
? ? ?f:可調用對象(函數(shù)對象缕坎、指向函數(shù)指針、函數(shù)引用篡悟、指向成員函數(shù)指針或執(zhí)行數(shù)據(jù)成員指針)
? ? ?args:要綁定的參數(shù)列表谜叹,未綁定參數(shù)為命名空間std::placeholders的占位符_1匾寝、_2、_3....所替換
三荷腊、bind原理
? ? ?1艳悔、可以用來將用戶提供的需要一個參數(shù)的函數(shù)轉換成不需要參數(shù)的函數(shù)對象。綁定的值存儲在函數(shù)對象內并且會被自動傳遞給指定的函數(shù)
? ? ? ? ? bind自身是函數(shù)模版女仰,第一個參數(shù)是可調用對象猜年;第二個參數(shù)是參數(shù)列表
? ? ? ? ? (方便理解,描述可能錯誤)bind內部通過函數(shù)指針存儲可調用對象疾忍;通過值存儲參數(shù)列表乔外;最終在函數(shù)對象(operator())中完成函數(shù)調用
? ? ?2、參數(shù)綁定也可以用于將類成員函數(shù)轉換成零參數(shù)的函數(shù)對象一罩。非靜態(tài)成員函數(shù)需要一個隱士的this參數(shù)(相當于一個雷對象指針)杨幼,這意味需要一個合適的類實例指針到這個函數(shù)對象
? ? ?3、隱士的this指針也可以顯示地傳遞給需要一個參數(shù)的函數(shù)對象(自己測試沒通過)
? ? ? ? ? 4聂渊、函數(shù)對象經常同事使用提前綁定的參數(shù)和調用時才提供參數(shù)差购,這個可以用成員函數(shù)來實現(xiàn)
? ? ? ? ? 5、使用非成員函數(shù)
? ? ? ? ? 6汉嗽、有時函數(shù)對象被調用時會提供多于的參數(shù)欲逃,而這些參數(shù)是目標函數(shù)不需要的,bind會自動忽略這些多于的參數(shù)
? ? ? ? ? 7饼暑、多于的參數(shù)不需要一定在函數(shù)對象簽名的最后面(std::placeholders的占位符 決定)
? ? ?8稳析、bind還允許重新組織函數(shù)對象的參數(shù)順序
四、使用詳解
? ? ?1撵孤、可調用元素
? ? ?2迈着、將std::bind綁定到可調用元素
? ?? ?????1)綁定到普通函數(shù)
? ? ? ? ? 2)綁定到函數(shù)模版
? ?? ?????3)綁定到lambda表達式
? ? ? ? ? 4)綁定到函數(shù)對象
? ? ? ? ? 5)綁定到類模版函數(shù)對象
? ? ? ? ? 6)綁定到靜態(tài)成員函數(shù)
? ? ? ? ? 7)綁定到靜態(tài)成員模版函數(shù)
? ? ? ? ? 8)綁定到成員函數(shù)(this指針,不預綁定)
? ? ? ? ? 9)綁定到成員模版函數(shù)(this指針邪码,不預綁定)
? ? ? ? ? 10)綁定到成員模版函數(shù)(this指針裕菠,預綁定)
? ? ? ? ? 11)綁定到成員模版函數(shù)(this指針,不預綁定)
五闭专、注意事項
? ? ?1奴潘、預綁定的參數(shù)是值傳遞的
? ? ?2、不預綁定的參數(shù)要用std::placeholders占位符的形式占位影钉,從_1開始画髓,一次遞增,是以引用的形式
? ? ?3平委、std::bind的返回值是可調用實體奈虾,可以直接賦值給std::function
? ? ?4、對于綁定的指針,引用類型參數(shù)肉微,調用者需要保證在調用之前生命周期還存在
? ? ?5匾鸥、std::placeholders表示新的可調用對象的第幾個參數(shù)和原函數(shù)的第幾個參數(shù)進行匹配
六、詳細代碼參考
鏈接:https://pan.baidu.com/s/1qZbbKNM 密碼:anm9
參考: