c++ - 使用模板别名(类型别名,使用)弃用模板化类名?

标签 c++ templates c++14 deprecated template-aliases

我想重命名一个模板类。为了让用户更轻松地进行转换,我想将旧类保留一个版本,并使用 GCC/Clang 的扩展(属性已弃用)将其标记为已弃用。 为了避免保留已弃用类的精确拷贝,使用模板别名会很方便。不幸的是,它似乎不起作用。这是我在 Clang 3.3、GCC 4.7 和 GCC 4.8 中尝试过的:

template <class blabla>
struct NewClassName
{
    // ...
};

template <class blabla> using OldClassName [[deprecated]]
  = NewClassName<blabla>;

我是不是漏掉了什么,或者这只是编译器不支持的?是否有其他想法可以在不复制整个类的情况下获得弃用警告?

最佳答案

GCC 从 4.9 版开始支持弃用模板别名(从 4.7 开始使用 __attribute__(deprecated))。这是一个比较 typedef 和模板别名的测试用例:

template <class T>
struct NewClassName
{
    // ...
};

template <class T> using OldClassNameUsing [[deprecated]]
  = NewClassName<T>;

typedef NewClassName<int> OldClassNameTypedef [[deprecated]];

int main()
{
  OldClassNameUsing<int> objectUsing;
  OldClassNameTypedef objectTypedef;

  return 0;
}

它对我不起作用的原因是我没有创建 OldClassNameUsing 的对象,而是访问了像 OldClassNameUsing::myFunction() 这样的静态成员。这永远不会触发弃用警告,除非函数本身已被弃用。

Clang 尚不支持弃用模板别名 - 已使用版本 13 进行测试。相应的功能请求是 <罢工>http://llvm.org/bugs/show_bug.cgi?id=17862 https://github.com/llvm/llvm-project/issues/18236 .

关于c++ - 使用模板别名(类型别名,使用)弃用模板化类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19791904/

相关文章:

c++ - 向继承自 QGraphicsScene 的类添加信号

c++ - 我可以在 C++ 中创建强类型整数吗?

c++将模板与单例一起使用

c++ - 只有当两个模板参数相同时,有没有办法覆盖模板方法匹配?

templates - 无法从 sitecore 中删除模板。出现错误 "The template is used by at least one item"?

c++ - C++中简单可变参数函数的无与伦比的模板?

c++ - 我想获取用户输入并将其放入字符串数组 c++

c++ - 多参数树遍历

c++ - 为什么默认情况下全局命名空间中没有 C++14 标准定义的文字?

c++ - 错误 : 'T' is not a template