2016-10-14 23 views
6

Mam następujący problem:Wiele pakietów parametrów - jak?

#include <vector> 
#include <tuple> 

using namespace std; 

template< size_t... N_i, typename Ts... > 
class A 
{ 
    // ... 

    private: 
    std::vector<size_t> _v = { N_i... }; 
    std::tuple<Ts...> _t; 
}; 

int main() 
{ 
    A<1> a; 
} 

Jak widać powyżej, staram się zdefiniować wiele parametrów paczki jako argumenty szablonu klasy A.
Niestety kod nie kompilacji:

error: expected nested-name-specifier before 'Ts'

Jak można zdefiniować wiele parametrów paczki dla tego przykładu?

+0

Dlaczego chcesz dać zawartość wektora jako parametry szablonu zamiast argument do konstruktora? – Anedar

+0

Masz błąd składniowy, powinien to być 'template '. Ale masz problem z wieloma pakietami parametrów ... – rodrigo

+0

@Brian Duplicate różni się od tego pytania. Problem polega na tym, że nie można wywnioskować paczek. Duplikat ma problemy podczas definiowania kontekstu, w którym można je wydedukować. – skypjack

Odpowiedz

8

Jednym ze sposobów, aby osiągnąć cel końcowy jest przez użyciem zagnieżdżonego szablonu:

template< size_t... N_i> class initial_values { 

public: 

    template <typename Ts...> 
    class A 
    { 
     // ... 

     private: 
     std::vector<size_t> _v = { N_i... }; 
     std::tuple<Ts...> _t; 
    }; 
}; 

Następnie szablon może się odwoływać, jak na przykład:

initial_values<1,2,3>::A<int, char> a; 
2

Rozważmy błąd:

expected nested-name-specifier before 'Ts'

Wynika to z faktu, że napisałeś:

template< size_t... N_i, typename Ts... > 

Zamiast:

template< size_t... N_i, typename... Ts > 

Mimo to, nawet jeśli go naprawić, kod nie będzie kompilować.
Dzieje się tak, ponieważ nie można mieszać dwóch zestawów parametrów w taki sposób, w jaki robiłeś.
Musisz odmienić swój kod, aby jakoś można było wywnioskować z kontekstu.

Jako przykład, można użyć std::index_sequence i częściową specjalizację jak następuje:

#include <vector> 
#include <tuple> 
#include<functional> 

using namespace std; 

template<typename...> 
class A; 

template< size_t... N_i, typename... Ts > 
class A<index_sequence<N_i...>, Ts...> 
{ 
    // ... 

    private: 
    std::vector<size_t> _v = { N_i... }; 
    std::tuple<Ts...> _t; 
}; 

int main() 
{ 
    A<index_sequence<1>> a; 
}