Kann eine variable Vorlage als Vorlagenvorlagenargument übergeben werden?

11

Das folgende unsinnige Beispiel wird nicht kompiliert. Gibt es jedoch eine andere Möglichkeit, eine Variablenvorlage als Vorlagenvorlagenargument zu übergeben?

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

Probieren Sie den Compiler Explorer aus

invexiert
quelle

Antworten:

3

Kurze Antwort: Nein.

Lange Antwort: Ja, Sie können eine Indirektion über eine Klassenvorlage verwenden:

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

Live Beispiel

Guillaume Racicot
quelle
scheint ein bisschen rückwärts, dass man mit statischem Element auf struct zurückgreifen muss. Ist dies etwas, was man mit einem zukünftigen Standard erwarten kann? Irgendeine Idee, warum es heute noch nicht möglich ist?
idclev 463035818
1
@ ehemalsknownas_463035818 Ich glaube, noch hat es niemand vorgeschlagen (noch nie in der Zeitung gesehen, vielleicht habe ich es verpasst?) Und es gibt auch eine Komplexität. Derzeit sind nicht typisierte Vorlagenparameter Pr-Werte. Aber was würde value<T>das bedeuten? Ein Verweis auf die globale Variable? Sie können ODR auch nicht als Nicht-Typ-Vorlagenparameter verwenden, sondern mit einer globalen Vorlage.
Guillaume Racicot
danke für die hinweise, ich bin immer noch auf c ++ 11, daher bin ich mit variablen vorlagen nicht allzu vertraut, und das ist etwas, von dem ich erwartet hätte, dass es
sofort funktioniert