我想在项目中弃用一个类模板。
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的所有用户发出警告,但代码仍然有效。
第二阶段
在下一个版本 - “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>;
这将再次引起用户的警告。
第3阶段
在最后一步 - 在版本“7”中完成 - 我将删除已弃用的别名,只留下更改的类。
template<size_t ElementSize, size_t Size>
class X {};
这整个方案有一些优点(在每个阶段代码编译和工作,只为不赞成的接口发出警告)和缺点(用户被迫改变他们的代码两次)。但是我没有提出更好的方法 - 我考虑的所有其他选项在某些时候都涉及编译错误。我在这里遇到的主要问题是我想保留班级的名称(在最后阶段),但是将模板“签名”从<type, value>
更改为<value, value>
,我假设排除了所有其他聪明的选择......
还有更好的选择吗?如果没有,上述方案是否似乎“可接受”,或者我应该只是导致一次编译失败并完成它?该项目处于开发的早期阶段,所以我不太关心向后兼容性,但我认为这是一个尝试整个过程的好机会。
答案 0 :(得分:1)
更简单的解决方案可能是引入一对宏。
在阶段1中,定义strtolower
的代码已经可以使用新API。在阶段2中,定义$notFound = array_diff(array_map('strtolower', $names), array_map(function($obj){ return strtolower($obj->getName()); }, $res));
的代码仍然可以使用旧API。在阶段3中,宏被忽略,所有代码都必须使用新的API。
当然,在一个程序中混合使用新旧API会稍微麻烦一些,将它们混合在一个翻译单元中就会产生问题。
在幕后,在第1阶段,您有一个name
,您可以在第2阶段切换到USE_NEW_API
。