2016-06-28 29 views
7

Szablony są dobre dla funkcji i klas szablonu programowania, więc możemy użyć, aby skrócić nasz kod i niech kompilator popracować dla nas.szablony o zmiennej liczbie argumentów i nie ma wartości

W moim przypadku chcę skorzystać z klasy szablon, np.

template <typename T, typename G> class unicorn { 
T value01; 
G value02; <- not used in ever instance of class unicorn 
}; 

Czy istnieje sposób, że kompilator uczynić wystąpienie z typename T = int na przykład i jeśli nie jest używany lub nie określono, wersja bez TypeName G?

więc, że wynik wygląda tak:

unicorn <double, int>; 

class unicorn { 
double value01; 
int value02; 
}; 

A bez argumentu lub określonego TypeName G

unicorn <double> 

class unicorn { 
T value01; 
// "not included in this instance" 
}; 
+0

Oddzielna szablon dla jednego rodzaju lub może o zmiennej liczbie argumentów szablonu i std :: krotki? – KIIV

+0

Wydaje się, że próbujesz narastającymi 'std :: tuple' z zastrzeżeniem, że nie ma więcej niż dwa parametry szablonu. –

Odpowiedz

5

Jeśli masz skończoną liczbę przypadków użycia i nie chcesz, aby zanurzyć się głęboko metaprogramowanie szablonów możesz po prostu zrobić specjalizację szablonową

#include <iostream> 
using namespace std; 

template <typename... Args> 
struct Something; 

template <typename T> 
struct Something<T> { 
    T a; 
}; 

template <typename T, typename U> 
struct Something<T, U> { 
    T a; 
    U b; 
}; 

int main() { 
    __attribute__((unused)) Something<int> a; 
    __attribute__((unused)) Something<int, double> b; 

    return 0; 
} 

Ale dla ogólny przypadek myślę, że std::tuple może załatwić sprawę tutaj. Spójrz na poniższy kod

#include <tuple> 
#include <iostream> 
using namespace std; 

template <typename... Args> 
class Something { 
    std::tuple<Args...> tup; 
}; 

int main() { 
    __attribute__((unused)) Something<int> a; 
    __attribute__((unused)) Something<int, double> b; 

    return 0; 
} 

Oczywiście należy zdawać sobie sprawę z pewnych rzeczy, jak std::ref i funkcji get<> z krotki. Możesz także uzyskać dostęp do typów pakietu szablonów za pomocą metaprogramowania w szablonach. Ja nie wyjaśniając, że tu, bo to może stać się naprawdę długą odpowiedź inaczej, jeśli nadal będzie tak jak ja do tego daj mi znać w komentarzu poniżej i postaram się wytłumaczyć.

+0

Powinieneś spróbować zrobić ogólne specjalizacje. – user2296177

+0

@ user2296177 Przepraszam Nie sądzę, że podążam, co masz na myśli? – Curious

+0

nie specjalizują się na '' i '' , specjalizuje się w '' i ''. Przykład: specjalizacja dwóch typów to 'template struct Something {T a; U b; }; ' – user2296177

Powiązane problemy