2015-06-11 24 views
6

Dlaczego w pakiecie szablonów variadic nie jest dozwolony określony typ?Variadic parametry szablonu jednego określonego typu

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

Whats uzasadnienie w nie pozwalając tym?
Czy są jakieś propozycje?


Uwaga: alternatywy byłoby

  • std::initializer_list<T> bez zwężenia typów i { } -brace składni
  • a (brzydki) rekurencyjne cecha, która sprawdza wszystkie typy oddzielnie: see here

Odpowiedz

6

To jest dozwolone, w rzeczywistości używasz go źle. T... i int... są pakietami parametrów nietypowych, a ich elementy są wartościami, więc nie można ich używać jako specyfikatorów typów (i nie można ich wywnioskować z wywołania funkcji).

Przykładem właściwej rejestracji:

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

IntPack<1,2,3> p; 

lub

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

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

Innym przykładem może być std::integer_sequence.

Powiązane problemy