C++1z 非型テンプレートパラメータのauto宣言

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*>{});
}

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。