boost::bind的定義和應用在boost網站中有明確的概述,但我幾乎找不到使用它比使用普通函式呼叫有什么好處?或者簡單地說,在哪些情況下它會派上用場呢?
uj5u.com熱心網友回復:
有時候,你有一組要傳遞給函式的引數,但你希望以后呼叫函式時不需要傳遞已經知道的引數。需要這樣做的一個原因可能是呼叫時可能需要符合一個不允許這些引數的介面。這在(漏斗式)"回呼 "習慣中是很典型的。
這種情況可以通過定義一個將引數存盤為成員的類來解決,并定義函式呼叫操作多載,該多載將委托給原始函式并傳遞存盤為成員的引數。
boost::bind是一種結構化的方式來表示這種 "引數系結",而不需要自己定義這個類。標準庫曾經有std::bind1st和std::bind2nd,它們是bind的更有限、更不通用的形式。
boost::bind現在已經很少需要了,因為它在C 11中作為std::bind被引入了標準庫,此外,lambdas在C 11中被引入,在C 14中被改進,它們在很大程度上已經淘汰了bind。
uj5u.com熱心網友回復:
bind提供了一種方法,通過精確系結一個或多個引數,將一個函式或具有一定算數的函式物件轉化為另一個具有較小算數的函式。而且你可以在原地進行。
bind和函式沒有一個很好的比較。
bind與簡單的lambdas更有可比性,后者呼叫一個函式并在其實作中固定某些引數。
boost::bind和現代lambda之間的最大區別是,bind物件有一定程度的自省,而lambda卻沒有。
例如,你原則上可以恢復原始函式,并重建引數系結的內容。 在 lambda 中,所有東西都是私有的,即使是最簡單的實作。
換句話說,boost::bind的結果是一個 "運算式",其型別有很好的定義模式(例如:boost::bind_t<...>之類的,并且可以在模板函式引數中匹配)。
而Lambdas則是他們自己的不可知的自成一體的型別。
誠然,也許很少有人會對這種差異感興趣,但它確實存在,而且我曾經用它來實作一個符號系統(用于衍生工具)。
我不能對std::bind說同樣的話,因為標準沒有指定回傳的物件,而且要重建完整的bind "運算式 "可能更加困難。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/309274.html
標籤:
