我想在我的项目中弃用一个类模板。
template<typename T, size_t Size>
class X {};
我想出了以下方案来做到这一点。
第一阶段
对于下一个版本——比方说版本“5”——我将提供具有不同名称(替换)的"new"类,并将旧的类转换为已弃用的别名:
template<size_t ElementSize, size_t Size>
class X2 {};
template<typename T, size_t Size>
using X __attribute__ ((deprecated)) = X2<sizeof(T), Size>;
这将对“旧”API 的所有用户发出警告,但代码仍然有效。
第二阶段
在下一个版本 - “6” - 我将删除“旧的”弃用类,将"new"类重命名为旧名称并创建一个弃用的别名:
template<size_t ElementSize, size_t Size>
class X {};
template<size_t ElementSize, size_t Size>
using X2 __attribute__ ((deprecated)) = X<ElementSize, Size>;
这将再次引起对用户的警告。
第三阶段
在最后一步中 - 在版本“7”中完成 - 我将删除已弃用的别名,只留下更改后的类。
template<size_t ElementSize, size_t Size>
class X {};
整个方案有一些优点(在代码编译和工作的每个阶段,只对不推荐使用的接口(interface)发出警告)和缺点(用户被迫两次更改他们的代码)。但是我没有想出更好的办法——我考虑过的所有其他选项在某些时候都涉及编译错误。我在这里面临的主要问题是我想保留类(class)的名称(在最后阶段),但将模板“签名”从 <type, value>
更改为至 <value, value>
,这(正如我假设的那样)排除了所有其他聪明的选择......
还有更好的选择吗?如果不是,上述方案是否看起来“可以接受”,或者我应该只导致一次编译失败并解决这个问题?该项目处于开发的早期阶段,所以我不太关心向后兼容性,但我认为这是尝试整个过程的一个很好的机会。
最佳答案
一个更简单的解决方案可能是引入一对宏。
在第 1 阶段,定义 USE_NEW_API
的代码已经可以使用新的 API。在阶段 2 中,定义 USE_OLD_API
的代码仍然可以使用旧的 API。在第 3 阶段,宏被忽略,所有代码都必须使用新的 API。
当然,将新旧API混合在一个程序中会稍微麻烦一些,而将它们混合在一个Translation Unit中则是自找麻烦。
在幕后,在第 1 阶段你有一个 #if !(defined(USE_OLD_API) || defined(USE_NEW_API)) #define USE_OLD_API
你切换到 #define USE_NEW_API
在第 2 阶段。
关于c++ - 在保留类名的同时弃用类模板的正确程序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43279308/