弃用带有模板别名的模板化类名(类型别名,使用)?

问题描述 投票:0回答:1

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

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

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

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

c++ templates c++14 deprecated template-aliases
1个回答
7
投票

GCC 从 4.9 版本开始支持弃用模板别名(从 4.7 开始使用

__attribute__(deprecated)
),从 19 版本开始支持 Clang。

这是一个比较 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() 这样的静态成员。除非函数本身已被弃用,否则这永远不会触发弃用警告。

© www.soinside.com 2019 - 2024. All rights reserved.