C++1y - 非型テンプレートパラメータの制限緩和に関する提案

N3413 - Allowing arbitrary literal types for non-type template parameters


C++11で導入されたconstexprによって、コンパイル時により多くのことができるようになりました。constexprでできるようになったものの一つに「constexprなコンストラクタを持ち、その他細かい条件を満たすクラスは、コンパイル時定数になることができる」というのがあります。

struct C {
    constexpr C(int v) : v(v) { }
    int v;
};

int main()
{
    constexpr C c(3);
    int ar[c.v]; // オブジェクトcも、そのメンバ変数vも定数なので、配列の要素数にできる
}

今回のこの提案は、このようなconstexprオブジェクトをテンプレート引数として渡せるようにしよう、というものです。

struct C {
    constexpr C(int v) : v(v) { }
    int v;
};

template <C c>
struct X {
    int ar[c.v];
};

これができるようになると、テンプレートの活用の幅が爆発的に広がるので、ぜひ入ってもらいたいですね。