2022年10月16日日曜日

cppでtemplateを利用して定義したclassを別名で呼べるようにしつつdeprecatedの警告をつける


背景

ライブラリとして公開しているクラス名を変えたくなったので取り組んだところ、templateを利用して定義したclassの別名での呼び出し方法と、deprecated(利用非推奨)警告の付与方法の把握に手間取ったので、備忘録を兼ねて記事を残します。

書き方:usingを利用し、deprecatedは=の前に記述

Template01というclassをTemplate1としても呼べるようにしつつ、Template1呼び出し時にはTemplate01を使うよう非推奨の警告を出す記述がこちらです。

template <class T>
class Template01 {
// definitions
};

template <class T>
using Template1 [[deprecated("Use Template01 instead")]] = Template01<T>;
usingの前にTemplate1用のtemplateを宣言し、Template01を割り当てる=の直前にdeprecatedを記述します。

これによってTemplate01もTemplate1も同じ使い方ができますが、Template1を使ったときだけビルド時に非推奨警告が表示されます。
Template01<int> instance01;
Template1<int> instance1;
src/main.cpp:12:16: warning: 'using Template1 = class Template01<int>' is deprecated: Use Template01 instead [-Wdeprecated-declarations]
Template1<int> instance1;
^~~~~~~~~
src/main.cpp:9:73: note: declared here
using Template1 [[deprecated("Use Template01 instead")]] = Template01<T>;
^

終わり

最初はtypedefを使えると思い試行錯誤しましたがビルドできる書き方が分からず、検索したらusingが使えると分かり期待通りに書けました。

参考

typedefでtemplate引数でとった型を使いたい(using)
C++ attribute: deprecated (since C++14)

0 件のコメント :