2015-06-11 13 views
6

Perché non è consentito un tipo specifico in un modello di modello variadic?Parametri del modello variabile di un tipo specifico

template< typename T > 
class Foo 
{ 
public: 
    template< typename... Values > 
    void bar(Values... values) 
    { 
    } 

    template< T... values >   <-- syntax error 
    void bar(T... values) 
    { 
    } 

    template< int... values >   <-- syntax error 
    void bar(int... values) 
    { 
    } 
}; 

Che cosa è la logica in non permettere questo?
Ci sono proposte per questo?


Nota: le alternative sarebbero

  • std::initializer_list<T> senza restringimento del tipo e della { } -brace-sintassi
  • un (brutto) tratto ricorsivo che controlla tutti i tipi separatamente: see here

risposta

6

È permesso, in realtà, lo stai semplicemente usando male. T... e int... sono pacchetti di parametri non di tipo ei loro elementi sono valori, quindi non è possibile utilizzarli come specificatori di tipi (e non è possibile dedurli da una chiamata di funzione).

Un esempio di uso corretto:

template<int... Is> 
struct IntPack {}; 

IntPack<1,2,3> p; 

o

template< typename T > 
struct Foo 
{ 
    template< T... Ts> 
    void bar() 
    { 
    } 
}; 

int main() 
{ 
    Foo<int> f; 
    f.bar<1,2,3>(); 
} 

Un altro esempio potrebbe essere std::integer_sequence.

Problemi correlati