C++1y で非型テンプレートパラメータへの提案

n3405 で面白い提案がされていたので覚書。


次のように非型テンプレートパラメータを受け取る場合、型を指定する必要がありました。

template<typename T, T t>
struct X{};

X<int, 10>::value     // == 10
X<bool, false>::value // == false


これを n3405 の提案では

// 受け取り側はこんな感じで書く
template<typename T t>
struct X{
    /* ... */
};

// 型を書く必要がない
X<10>::value     // == 10
X<false>::value // == false


のように書くことが出来ます。
本文中にも書いてありますが、こんな感じに書くことも出来ます。

struct A {
    void f(int i);
};

// 現行の仕様では decltype 等型を渡す必要がある
// X<decltype(&A::f), &A::f>

// n3405 ではその必要はない
X<&A::f>


また、上記とは別にクラステンプレートのコンストラクタから型推論を行うという提案も出ています。
これを使用した場合、

template<typename T>
struct X{
    X(T t) : value(t){}
    
    T value;
};

auto x = X<int>{ 10 };




template<typename T>
struct X{
    X(T t) : value(t){}
    
    T value;
};

// 型を書く必要がない
auto x = X{ 10 };


のように書くことが出来ます。
これの何が嬉しいかっていうと make_xxx のようなヘルパー関数を用意する必要がなくなります。

template<typename T>
X<T>
make_X(T t){
    return { t };
}

auto x1 = make_X(10);
auto x2 = make_X(3.14f);

auto x1 = X{ 10 };
auto x2 = X{ 3.14f };


と書けます。
応用すれば make_tuple とかもこんな感じに書けるんじゃなかろうかと。
結構癖が強そうですけど、実際に導入されればいろいろと楽になりそうな提案ですね。