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.