[英]Why does boost recommend using core functions over member functions?
在boost.geometry的文檔中,它說明了
注意:更喜歡使用x = bg :: get :<0>(point1);
(而不是x = point1.get <0>();)
我在boost docs的其他地方看過這個。 我的問題是為什么? 這是最好的做法,表演還是一些怪癖? 這是一般規則還是特定於此庫?
它本身並不是提升,而是現代C ++ API設計。
通過不要求成員函數,您可以調整自己的類甚至第三方庫類型以使用您選擇的boost Api。 (這樣您就可以將類型從第三方庫序列化為Boost Serialization存檔)。
此外,通過使函數自由函數,可以改善依賴關系的解耦。 例如: fusion/tuple.hpp
不需要依賴任何與IO相關的東西,因為流操作是自由函數,因此可以在單獨的頭中聲明(和定義): fusion/tuple_io.hpp
。
它還有助於封裝,因為默認情況下,自由函數不是宿主類的friend
(因此無法訪問私有成員)。
免費功能可以基於ADL“做正確的事”:
using std::swap; swap(a, b); // will lookup `swap` in the namespaces that declare the parameter types
(其他幾個名稱空間也用於查找)
最后,自由函數可以一般地為一組類型提供服務,這些類型不需要與OO相關(與繼承相關)。 通過這種方式,自由函數可以避免重復代碼。
編輯解決為什么您應該更喜歡非成員語法的問題, 如果兩者都存在 :
.template
消歧(正如@Simple所指出的那樣) 再說一遍:這不是特定的提升。
std::swap()
作為自由函數 std::begin()
和std::end()
引入為自由函數 std::hash<>
, std::less<>
, std::greater<>
, std::equal_to<>
同樣提供非侵入性的定制點 (當然不是函數 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.