2011-09-23 17 views
6

W Bjarne Stroustrup C++ Book (rozdział 13, strona 331) napisano, że "parametr szablonu może być użyty w definicji następnego parametru szablonu". I podaje następujący kod:Czy parametry szablonu mają być typami?

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

Czy każdy może podać przykład użycia tego szablonu. Na przykład, jak zainicjować obiekt Cont? Wygląda mi na to, że "def_val" nie jest argumentem typu i nie powinno być umieszczane w <>. Czy się mylę?

dziękuję

+3

powinieneś wiedzieć, że jest to ważne tylko wtedy, gdy T jest typem integralnym. – Riga

Odpowiedz

7

można zrobić coś takiego:

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 

parametry szablonu nie muszą być typy.

to działa tylko T jest integralną typu (int, unsigned, long, char itp ale nie float, std::string, const char*, etc), jak @Riga wspomniane w jego/jej komentarz.

6

def_val jest wartością argumentu. Instancji mógłby wyglądać następująco:

Cont<int, 1> foo; 

Interesujący przypadek, gdy jest to użyteczne jest, gdy chcesz mieć wskaźnik do klasy-członka jako szablon paremeter:

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

ta umożliwia foo być utworzona za pomocą wskaźnika do elementu typu int dowolnej klasy.

+2

Chociaż myślę, że poprawnym terminem jest "parametr szablonu non-type". – pmr

3

Oto przykład tego, jak wystąpienia powyższego:

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

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

T def_val jest obiektem typu T (który był poprzednio minęła). Może służyć na przykład do inicjowania elementów w kontenerze. Aby go wykorzystać, by to wyglądać mniej więcej tak:

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

(psuedo kodu; Object musi oczywiście być typu to prawny do wykorzystania w ten sposób)

To wtedy wykorzystuje drugi parametr szablonu. Jest zawarty w szablonie, ponieważ ma typ szablonu; def_val musi być typu T i musi zostać przekazany, gdy obiekt zostanie utworzony.

+0

Nie wiem, czy to działa. Może jeśli konstruktor obiektu jest constexpr? –

+0

Dodano pewne zastrzeżenie. – ssube

Powiązane problemy