簡體   English   中英

為什么boost建議使用核心功能而不是成員函數?

[英]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所指出的那樣)
  • 再說一遍:這不是特定的提升。

    • c ++ 03將std::swap()作為自由函數
    • c ++ 11將std::begin()std::end()引入為自由函數
    • std::hash<>std::less<>std::greater<>std::equal_to<>同樣提供非侵入性的定制點 (當然不是函數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM