変数テンプレートをテンプレートテンプレート引数として渡すことはできますか?


11

次の無意味な例はコンパイルされませんが、変数テンプレートをテンプレートテンプレート引数として渡す他の方法はありますか?

template<typename T>
constexpr auto zero = T{0};

template<typename T, template<typename> auto VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T> + T{1};
}

int main()
{
    return add_one<int, zero>();
}

コンパイラエクスプローラーを試す

回答:


3

短い答え:いいえ。

長い答え:はい、クラステンプレートを介していくつかの間接参照を使用できます。

template<typename T>
constexpr auto zero = T{0};

template<typename T>
struct zero_global {
    static constexpr auto value = zero<T>;
};

template<typename T, template<typename> class VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T>::value + T{1};
}

int main()
{
    return add_one<int, zero_global>();
}

実例


静的メンバーを使用して構造体に頼らなければならないのは少し逆のようです。これは、将来の標準で期待できるものですか?なぜ今日すでにそれが可能ではないのでしょうか?
idclev 463035818

1
@ formerlyknownas_463035818私は誰もそれをまだ提案していないと思います(論文でこれを見たことがない、おそらく私はそれを逃したのでしょうか?)そして複雑さもあります。現在、タイプではないテンプレートパラメータはpr値です。しかし、どういうvalue<T>意味でしょうか?グローバル変数への参照?また、ODRでタイプ以外のテンプレートパラメーターを使用することはできませんが、テンプレートグローバルでは使用できます。
ギヨームラシコット

ヒントのためのおかげで、私は、可変テンプレートとあまり馴染みのないですので、私は、C ++ 11の上にはまだ、と私は、箱から出して動作するように期待したのthats何か
idclev 463035818
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.