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 とかもこんな感じに書けるんじゃなかろうかと。
結構癖が強そうですけど、実際に導入されればいろいろと楽になりそうな提案ですね。