2017-04-07 28 views
1

我想在我的項目中棄用一個類模板。在保留類名的同時棄用類模板的正確過程是什麼?

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>,這(我認爲)排除了所有其他聰明的選項...

有沒有更好的選擇?如果不是,上面的方案看起來是「可接受的」,或者我應該只是導致一個編譯失敗並且完成那個?該項目正處於開發的早期階段,因此我並不十分關注向後兼容性,但我認爲這是一個嘗試整個過程的好機會。

+3

我不知道這有很多工作要做,模板#if !(defined(USE_OLD_API) || defined(USE_NEW_API)) #define USE_OLD_API(或實際上,類!)。這是「我如何引入向後不兼容的變更?」的通用全球性問題。 –

+0

對多個版本的逐漸棄用和移除通常是一個好方法。如果使用產品的[語義版本控制](http://semver.org/),這可能會更容易。另外,*文檔文檔文檔*對此非常重要。 –

+0

@OliverCharlesworth - 在功能折舊的情況下,問題會更容易,因爲我會引入重載並完成它,但是在這裏不可能有一個「模板重載」,它將「類型」更改爲「值」簽名... –

回答

1

一個更簡單的解決方案可能是引入一對宏。

在階段1中,定義USE_NEW_API的代碼已經可以使用新的API。在階段2中,定義USE_OLD_API的代碼仍然可以使用舊的API。在階段3中,宏被忽略,所有代碼都必須使用新的API。

當然,在一個程序中混合舊的和新的API稍微麻煩一些,將它們混合到一個翻譯單元中是在尋求問題。

在幕後,在第一階段,你有你切換到#define USE_NEW_API階段2

相關問題