C++14まで、以下のように書いていた「指定された型の定数を受け取る」意図の非型テンプレートパラメータ(non-type template parameter)ですが、
template <class T, T V> struct X; X<int, 3>;
C++1zではこの用途のためのシンタックスシュガー(糖衣構文、syntactic sugar)が導入されます。そのためには、テンプレートパラメータをauto
にして値を受け取るようにします。
template <auto X> struct A {}; A<3>; // OK A<true>; // OK A<'a'>; // OK A<3.14>; // コンパイルエラー (浮動小数点数は渡せない)
テンプレートの中では、decltype
を使用すればX
の型を取得できます。
このauto
は、変数宣言のauto
と同じくプレースホルダーという扱いになります。そのため、template <auto* P>
やtemplate <auto& R>
のような推論補助もできます。
#include <type_traits> template <auto* X> struct A { using type = decltype(X); }; int main() { constexpr int* p = nullptr; static_assert(std::is_same<A<p>::type, int*>{}); }
参照
- P0127R1 Declaring non-type template arguments with
auto
- P0127R2 Declaring non-type template parameters with
auto
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。