Değişken bir şablon, şablon şablonu argümanı olarak iletilebilir mi?


11

Aşağıdaki saçma örnek derlenmez, ancak şablon şablonu bağımsız değişkeni olarak bir değişken şablonu geçirmenin başka bir yolu var mı?

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

Derleyici Gezgini'ni deneyin

Yanıtlar:


3

Kısa cevap: Hayır.

Uzun cevap: Evet, bir sınıf şablonu aracılığıyla bazı dolaylı işlemler kullanabilirsiniz:

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

Canlı örnek


statik üye ile yapılandırmak için başvurmak zorunda biraz geriye görünüyor. Bu, gelecekteki bir standartla gelmeyi bekleyebilecek bir şey mi? Bugün neden mümkün olmadığı hakkında bir fikrin var mı?
— idclev 463035818

1
@ formerlyknownas_463035818 Henüz kimsenin önerdiğini düşünmüyorum (gazetede hiç görmedim, belki de özledim mi?) Ve bir de karmaşıklık var. Şu anda, tür olmayan şablon parametresi pr-değerleridir. Ama ne anlama gelirdi value<T>? Global değişkene bir referans? Ayrıca, ODR türü olmayan şablon parametresini kullanamazsınız, ancak global bir şablonla yapabilirsiniz.
— Guillaume Racicot

ipuçları için teşekkürler, ben hala c ++ 11 üzerinde, bu yüzden değişken şablonlara çok aşina değilim ve kutunun dışında çalışmayı
— umduğum bir şey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.