[英]Strong typedef for primitive types (BOOST_STRONG_TYPEDEF is not cutting it)
[英]Why does boost include two different versions of strong_typedef.hpp?
在我最近建立一個項目時,我注意到有一個關於重新定義的BOOST_STRONG_TYPEDEF
宏的編譯器警告(轉向錯誤)。 經過進一步調查,我注意到strong_typedef.hpp
包含兩個不同版本的strong_typedef.hpp
:一個位於頂層,一個位於serialization/
。
兩個版本之間實際上也存在差異,而不僅僅是宏的重復版本。 頂級版本沒有顯式值 - 初始化它的T
而序列化版本執行:
代碼剪輯:
boost/strong_typedef.hpp
:
T t; \
explicit D(const T t_) : t(t_) {}; \
D(){}; \
D(const D & t_) : t(t_.t){} \
boost/serialization/strong_typedef.hpp
:
T t; \
explicit D(const T t_) : t(t_) {}; \
D(): t() {}; \
D(const D & t_) : t(t_.t){} \
為什么有兩個不同版本的宏,哪一個作為實現更有意義? 將強制內置類型初始化的那個,或者不強制內置類型的那個(盡可能地模仿基礎類型強類型化)?
我是boost/strong_typedef.hpp
兩個版本的作者。
由於強烈反對直接包含在boost基本標題中,我轉移到了序列化庫。 為了保持向后兼容性,我把它留在了boost base頭目錄中。 我忘了將此文件合並到發布分支中,因此會出現警告。 我也忘了將名稱更改為BOOST_SERIALIZATION_STRONG_TYPEDEF
。 從那時起,我將初始化添加到基類。 我想自從我進行了拆分后,我在序列化庫中包含了版本修正。
我只是查看了序列化庫,現在使用strong_typedef是最小的。 我想我會徹底解決它。 那么它就會完全消失。
它應該是一個單獨的實用程序。 但我無法真正處理所需的所有提升(測試,文檔,構建,審查)。 並且boost對於這些小型頭文件實用程序沒有一個非常好的位置。 有一天,我希望序列化庫所需的這些小工具將遷移到boost基礎。 但是我開始對這個想法感到氣餒。
看起來boost/strong_typedef.hpp
目錄是一個歷史工件。
缺少t
成員的顯式初始化是幾年前在svn修訂版71183中修復的boost/serialization/strong_typedef.hpp
中的錯誤 。請參閱錯誤標記。
在Boost的Subversion主干中, boost/strong_typedef.hpp
是一個很空的文件,它說:
#error "This header is deprecated. Please use: boost/serialization/strong_typedef.hpp"
這個變化,r48575,是在2008年制作的 - 我不知道為什么它從未被合並到一個版本中。 也許是因為它會在沒有很大好處的情況下打破用戶,或者可能是一種疏忽。 同樣的變化(r48575)是在trunk中創建boost/serialization/strong_typedef.hpp
的。
如果他們不想破壞現有用戶,那么被棄用的文件可能只包含boost/serialization
的文件,因此只有一個規范的實現。 在任何情況下,似乎如果你可以避免使用boost/strong_typedef.hpp
使用serialization
中的那個,這就是我的建議。
作為旁注,請記住,一年前Boost Serialization(和strong_typedef.hpp
)的作者Bob Ramey 在另一個關於strong_typedef.hpp
錯誤票據中發表了評論 ,您可能會感興趣:
我認為序列化庫不再使用它了。 當然它還在那里。 我不知道是否有人使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.