使用模板别名(类型别名,使用,C ++ 11)弃用模板化的类名称?

时间:2013-11-05 14:56:48

标签: c++ templates c++11 deprecated template-aliases

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

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

template <class blabla> using OldClassName __attribute__ ((deprecated))
  = NewClassName<blabla>;

我是否会遗漏某些内容或者编译器是否支持这些内容?还有其他想法可以在不复制整个类的情况下获得弃用警告吗?

1 个答案:

答案 0 :(得分:6)

自版本4.7起,GCC支持弃用模板别名。这是比较typedef和模板别名的测试用例:

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

template <class T> using OldClassNameUsing __attribute__ ((deprecated))
  = NewClassName<T>;

typedef NewClassName<int> OldClassNameTypedef __attribute__ ((deprecated));

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

  return 0;
}

它之所以不起作用,是因为我没有创建OldClassNameUsing的对象,而是访问了像OldClassNameUsing :: myFunction()这样的静态成员。除非不推荐使用函数本身,否则不会触发弃用警告。

Clang还不支持弃用模板别名 - 使用SVN r194323的3.3和3.4版测试。相应的功能请求是 http://llvm.org/bugs/show_bug.cgi?id=17862
Clang在版本4中仍不支持此功能。对于C ++ - 14 [[已弃用]]也是如此。