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.