2011-09-23 27 views
6

Nel libro C++ di Bjarne Stroustrup (capitolo 13, pagina 331), si diceva che "un parametro modello può essere utilizzato nella definizione del successivo parametro template". E dà il seguente codice:I parametri del modello devono essere tipi?

template<class T, T def_val> class Cont{ /* ... */ } 

Qualcuno può fornire un esempio di come utilizzare questo modello. Ad esempio, come inizializzare un oggetto di Cont? Mi sembra che "def_val" non sia un argomento di tipo e non dovrebbe essere inserito in <>. Ho sbagliato?

Grazie mille

+3

si dovrebbe sapere che questo è valido solo se T è un tipo integrale – Riga

risposta

7

si può fare qualcosa di simile:

Cont<int, 6> cnt; 
//  ^as long as this is of type T (in this case int) 
// def_val will be of type int and have a value of 6 

parametri dei modelli non sono tenuti ad essere i tipi.

Questo funziona solo quando T è un tipo integrale (int, unsigned, long, char ecc ma non float, std::string, const char*, ecc), come @Riga menzionato nella sua/il suo commento.

6

def_val è un argomento di valore. Un'esemplificazione potrebbe essere la seguente:

Cont<int, 1> foo; 

Un caso interessante in cui questo è utile è quando si desidera avere un puntatore a una classe membri come modello paremeter:

template<class C, int C::*P> 
void foo(C * instance); 

Ciò consente foo essere istanziato con un puntatore a un membro di tipo int di qualsiasi classe.

+2

Anche se penso che il termine corretto sia 'parametro modello non-tipo'. – pmr

3

Ecco un esempio di come istanziare quanto sopra:

template<class T, T def_val> class Cont{ /* ... */ }; 

int main() 
{ 
    Cont<int,42> c; 
} 
2

T def_val è un oggetto di tipo T (precedentemente passata). Potrebbe essere usato per inizializzare gli oggetti nel contenitore, per esempio. Per usare, sarebbe simile:

Object init(0); 
Cont<Object, init> cont; 

(pseudo-codice; Object deve, ovviamente, essere un tipo che è legale da utilizzare in questo modo)

Che poi utilizza il secondo parametro di template. È incluso nel modello perché ha un tipo di modello; def_val deve essere di tipo T e deve essere passato quando l'oggetto viene creato.

+0

Non so se funziona. Forse se il costruttore di Object è constexpr? –

+0

Aggiunto un po 'di disclaimer. – ssube

Problemi correlati