2016-05-22 14 views
6

Voglio che un parametro template accetti un modello che abbia un argomento numerico del template.Come avere un parametro modello template come valore numerico?

Questo esempio forse eccessivamente semplificato, ma vorrei qualcosa di simile:

template <int X> 
struct XX 
{ 
    static const int x = X; 
}; 

template<typename TT, TT V, template<V> TX> 
void fnx(TX<V> x) 
{ 
    static_assert(V == TX::x, "IMPOSSIBLE!"); 
} 

void fny() 
{ 
    fnx(XX<1>()) 
} 

non deve essere la comprensione della sintassi per questo, come deve essere possibile. Come potrei realizzare questo?

+2

cosa sta 'TT' dovrebbe essere? come dovrebbe il compilatore dedurre il suo tipo quando chiama 'fnx' in' fny'? puoi dare più contesto del tuo problema che stai cercando di risolvere con questo approccio? –

+0

@ m.s. 'int', presumibilmente. – Barry

+0

Sintatticamente è necessario 'modello classe TX'. Ma non è tutto il problema. –

risposta

6

Basta fissare la vostra sintassi un po '- in quanto il parametro template non è correttamente specificato, saremmo finiti con qualcosa di simile:

template <typename T, template <T > class Z, T Value> 
//     ^^^^^^^^^^^^^^^^^^^^^ 
void foo(Z<Value> x) { } 

Tuttavia, il compilatore non può dedurre T qui - è un contesto non dedotto. Dovresti fornire esplicitamente:

foo<int>(XX<1>{}); 

Questo è piuttosto fastidioso. Non riesco nemmeno a scrivere un tratto di tipo tale che lo non_type_t<XX<1>> sia int (dove quel tipo di carattere fa un'introspezione reale sul tipo, non qualcosa che banalmente restituisce int).


C'è una proposta per migliorare questo processo (P0127) attraverso una modifica del contesto-ness non dedotta di non-argomenti di tipo template.

+0

Sembra la proposta 'modello ', in attesa di un voto a Oulu. – chris

+0

@chris Sì, l'ho trovato. – Barry

+0

Ah, si. Il tipo di parametro è un tipo, non un valore. Grazie. Peccato per l'errore di deduzione automatica però. :( – Adrian

2

La vostra dichiarazione di fnx richiede un po 'di lavoro e il tipo TT non può essere dedotto nel sito di chiamata.

template<typename TT, TT V, template<TT> class TX> 
void fnx(TX<V> x) 
{ 
    static_assert(V == TX<V>::x, "IMPOSSIBLE!"); 
} 

void fny() 
{ 
    fnx<int>(XX<1>()); 
} 

esempio di lavoro: https://ideone.com/57PsCA

Problemi correlati