C++17 のクラステンプレートのテンプレート引数推論を使ってみて
C++17 では『クラステンプレートのテンプレート引数推論』という機能が新しく追加されました。
どういう機能かというと C++17 以前では以下のようなクラステンプレートを使用する場合はテンプレート引数を明示化する必要がありました。
template<typename T> struct A{ A(T t) : t{} }; // テンプレート引数を渡して値を定義 auto a = A<int>{42};
しかし、C++17 ではこれを推論してくれるようになりました。
template<typename T> struct A{ A(T t) : t{} }; // コンストラクタの引数から T 型を推論してくれる auto a = A{42};
これによりクラステンプレートを生成する make_xxx
みたいなヘルパ関数を大幅に削減する事が出来そうですね。
上記はコンストラクタから推論していますが、他にも『推定ガイド(deduction guide)』という構文を使用しても推論する事が出来ます。
[Clang 5.0(svn306440) では一部動作しなかった]
本題というか単に Clang 5.0(svn306440) だと動作しなかった、という話ですが。
Clang 5.0(svn306440) では次のようにクラステンプレートのインナークラスだとコンパイルエラーになりました。
template<typename F> struct X{ template<class T> struct A { A(T&& t) : value(t){} T value; }; }; // error: no viable constructor or deduction guide for deduction of template arguments of 'A' auto a = X<int>::A{42};
https://wandbox.org/permlink/ylwbjUX5xs6JFbfn
X
がクラステンプレートでなかったり、GCC 8.0 では問題なかったので Clang のバグかなぁ…。