我想在我的項目中棄用一個類模板。在保留類名的同時棄用類模板的正確過程是什麼?
template<typename T, size_t Size>
class X {};
我想出了一個如下方案來做到這一點。
第1階段
對於下一個版本 - 假設版本「5」 - 我會提供不同的名稱(替換)「新」級和轉換舊的過時的別名:
template<size_t ElementSize, size_t Size>
class X2 {};
template<typename T, size_t Size>
using X __attribute__ ((deprecated)) = X2<sizeof(T), Size>;
這將對所有「舊」API用戶發出警告,但代碼仍然有效。
第2階段
在未來的版本 - 「6」 - 我要刪除「舊」過時類,重命名「新」到舊名稱和創建廢棄別名:
template<size_t ElementSize, size_t Size>
class X {};
template<size_t ElementSize, size_t Size>
using X2 __attribute__ ((deprecated)) = X<ElementSize, Size>;
這將再次引起用戶警告。
第3階段
在這最後一步 - 在版本「7」做 - 我會刪除廢棄的別名,只留下了更改的類。
template<size_t ElementSize, size_t Size>
class X {};
這整個方案具有一些優點(在代碼編譯和工作的每一個階段,僅針對不推薦使用的接口發出的警告)和劣勢(用戶被迫兩次修改他們的代碼)。但是我沒有提出任何更好的選擇 - 我考慮的所有其他選項都涉及編譯錯誤。我在這裏面臨的主要問題是我想保留班級名稱(在最後階段),但將模板「簽名」從<type, value>
更改爲<value, value>
,這(我認爲)排除了所有其他聰明的選項...
有沒有更好的選擇?如果不是,上面的方案看起來是「可接受的」,或者我應該只是導致一個編譯失敗並且完成那個?該項目正處於開發的早期階段,因此我並不十分關注向後兼容性,但我認爲這是一個嘗試整個過程的好機會。
我不知道這有很多工作要做,模板
#if !(defined(USE_OLD_API) || defined(USE_NEW_API)) #define USE_OLD_API
(或實際上,類!)。這是「我如何引入向後不兼容的變更?」的通用全球性問題。 –對多個版本的逐漸棄用和移除通常是一個好方法。如果使用產品的[語義版本控制](http://semver.org/),這可能會更容易。另外,*文檔文檔文檔*對此非常重要。 –
@OliverCharlesworth - 在功能折舊的情況下,問題會更容易,因爲我會引入重載並完成它,但是在這裏不可能有一個「模板重載」,它將「類型」更改爲「值」簽名... –