È possibile passare un modello variabile come argomento del modello modello?


11

Il seguente esempio senza senso non viene compilato, ma esiste un altro modo per passare un modello variabile come argomento del modello modello?

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

Prova su Compiler Explorer

Risposte:


3

Risposta breve: No.

Risposta lunga: Sì, puoi utilizzare alcune indicazioni indirette tramite un modello di 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>();
}

Esempio dal vivo


sembra un po 'arretrato che si debba ricorrere alla strutturazione con membro statico. È qualcosa che ci si può aspettare da uno standard futuro? Qualche idea sul perché non sia possibile già oggi?
idclev 463035818,

1
@ formerlyknownas_463035818 Non credo che nessuno l'abbia ancora proposto (non l'hai mai visto sul giornale, forse l'ho perso?) E c'è anche una complessità. Al momento, i parametri del modello non di tipo sono valori pr. Ma cosa value<T>significherebbe? Un riferimento alla variabile globale? Inoltre, non puoi utilizzare ODR per utilizzare un parametro modello non di tipo, ma puoi farlo con un modello globale.
Guillaume Racicot,

grazie per i suggerimenti, sono ancora su c ++ 11, quindi non ho troppa familiarità con i modelli variabili e questo è qualcosa che mi sarei aspettato di lavorare fuori dalla scatola
idclev 463035818,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.