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

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.