Bisakah templat variabel diteruskan sebagai argumen templat templat?

11

Contoh tidak masuk akal berikut ini tidak mengkompilasi, tetapi apakah ada cara lain untuk meneruskan templat variabel sebagai argumen templat templat?

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>();
}

Coba di Compiler Explorer

invexed
sumber

Jawaban:

3

Jawaban singkat: Tidak.

Jawaban panjang: Ya, Anda dapat menggunakan beberapa tipuan melalui templat kelas:

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>();
}

Contoh langsung

Guillaume Racicot
sumber
tampaknya agak mundur bahwa seseorang harus menggunakan struct dengan anggota statis. Apakah ini sesuatu yang bisa diharapkan untuk datang dengan standar masa depan? Adakah yang tahu mengapa hal ini tidak mungkin terjadi hari ini?
idclev 463035818
1
@ mantanlyknownas_463035818 Saya tidak berpikir ada yang mengusulkan itu (tidak pernah melihatnya di koran, mungkin saya melewatkannya?) Dan ada juga kompleksitas. Saat ini, parameter template non-tipe adalah nilai-pr. Tapi apa value<T>artinya? Referensi ke variabel global? Selain itu, Anda tidak dapat ODR menggunakan parameter template non-tipe, tetapi Anda bisa dengan template global.
Guillaume Racicot
terima kasih atas petunjuknya, saya masih menggunakan c ++ 11, jadi saya tidak terlalu terbiasa dengan templat variabel, dan itulah sesuatu yang saya perkirakan akan berhasil di luar kotak
idclev 463035818