gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:14:52 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com