2016-06-28 19 views
7

I modelli sono utili per la programmazione di funzioni e classi del modello, quindi possiamo utilizzare per abbreviare il nostro codice e consentire al compilatore di lavorare per noi.Modelli variabili e nessun valore

Nel mio caso voglio fare uso di un modello di classe es.

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

C'è un modo, che il compilatore fanno un'istanza con nometipo T = int per esempio e se non utilizzato o specificato, versione senza nometipo G?

In modo che il risultato è simile:

unicorn <double, int>; 

class unicorn { 
double value01; 
int value02; 
}; 

E senza discussioni o typename specificato G

unicorn <double> 

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

Modello separato per un modello o forse variadic template e std :: tuple? – KIIV

+0

Sembra che tu stia cercando di reinventare 'std :: tuple' con l'avvertenza che non vuoi più di due parametri template. –

risposta

5

Se si dispone di un numero finito di casi d'uso e non si vuole immergersi in profondità template metaprogrammazione allora si può semplicemente fare modello di specializzazione

#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; 
} 

Ma per il caso generale penso che un std::tuple potrebbe fare il trucco qui. Date un'occhiata al seguente codice di

#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; 
} 

Ovviamente si deve essere a conoscenza di alcune cose come std::ref e la funzione get<> con una tupla. Puoi anche accedere ai tipi di un pacchetto modello con alcuni metaprogrammazione del modello. Non lo sto spiegando qui perché potrebbe diventare una risposta lunga in realtà altrimenti, se vorresti che lo facessi, fammelo sapere in un commento qui sotto e cercherò di spiegartelo.

+0

Dovresti provare a rendere le specializzazioni generiche. – user2296177

+0

@ user2296177 scusa non penso di seguirla, cosa intendi? – Curious

+0

Non specializzati per '' e '', specializzati per '' e ''. Esempio: la specializzazione in due tipi è 'template struct Something {T a; U b; }; ' – user2296177