Un modèle de variable peut-il être passé comme argument de modèle de modèle?

11

L'exemple absurde suivant ne se compile pas, mais existe-t-il un autre moyen de passer un modèle de variable comme argument de modèle de modèle?

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

Essayez sur Compiler Explorer

invexe
la source

Réponses:

3

Réponse courte: Non.

Réponse longue: Oui, vous pouvez utiliser une indirection via un modèle de classe:

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

Exemple en direct

Guillaume Racicot
la source
semble un peu en arrière qu'il faut recourir à struct avec membre statique. Est-ce quelque chose que l'on peut attendre avec une future norme? Une idée pourquoi ce n'est pas possible déjà aujourd'hui?
idclev 463035818
1
@ formerlyknownas_463035818 Je pense que personne ne l'a encore proposé (je ne l'ai jamais vu dans le journal, peut-être que je l'ai manqué?) Et il y a aussi une complexité. À l'heure actuelle, les paramètres de modèle non-type sont des valeurs pr. Mais qu'est-ce que value<T>cela signifierait? Une référence à la variable globale? En outre, vous ne pouvez pas utiliser ODR de paramètre de modèle non-type, mais vous pouvez le faire avec un modèle global.
Guillaume Racicot
merci pour les conseils, je suis toujours sur c ++ 11, donc je ne suis pas trop familier avec les modèles de variables, et c'est quelque chose que je m'attendais à travailler hors de la boîte
idclev 463035818