c++ - 在保留类名的同时弃用类模板的正确程序是什么?

标签 c++ templates deprecated deprecation-warning

我想在我的项目中弃用一个类模板。

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/

相关文章:

c++ - 无法使用 BoundsChecker 检测内存问题

c++ - libjpeg 中的指针对齐

C++ 模板特化,明确地调用可能是指针或引用的类型的方法

c++ - 更改对已弃用方法的引用 C++

protocol-buffers - 是否允许取消弃用 protobuf 字段?

c++ - 使用精度集删除尾随 0 的优雅解决方案

c++ - 如何从命令行编译 bada gcc 工具链?

c++ - 使用 `using` 或其他方式显式实例化函数模板

c++ - 模板类特化

scala - 为什么不推荐使用没有参数列表的案例类?