2014-09-02 37 views
6

Załóżmy, że mam:Model pamięci funkcji szablonu w klasie innej niż szablon?

template <typename T> 
class A 
{ 
    //Do something with T 
}; 

wiem, że kompilator wygeneruje class A<T> dla każdego innego T zdefiniowanego w kodzie.

Co zrobić, jeśli mam:

class B 
{ 
    template <typename T> 
    void f() { /* Do something with T */ } 
}; 

Czy istnieje tylko jedna definicja class B ale wiele przeciążenia f() dla każdego innego T to nazywa się?

+1

Tak. Cóż innego mogło być? –

+3

Om Poziom montażu tam nie ma definicji klas. Każda metoda klasy jest kompilowana do funkcji globalnej z ukrytym "tym" parametrem. Funkcja templatowana jest kompilowana do funkcji globalnej dla każdego typu instancji, w każdej jednostce kompilacji. –

+0

Możliwy duplikat? [Klasa z szablonową funkcją składową, czy ta sama klasa?] (Http://stackoverflow.com/questions/11121910/class-with-templated-member-function-is-the-same-class) –

Odpowiedz

1

Tak, przy każdym utworzeniu f<T> pojawi się definicja f() wygenerowana przez kompilator.
W zależności od kompilatora, f() może zostać zoptymalizowany ze względu na wstawianie lub może uzyskać tyle miejsca w segmencie kodu.

Jednak rzadko spotykałem się z takim projektem, w którym masz niestatyczną funkcję składową szablonu (bez żadnych argumentów!) Wewnątrz klasy innej niż szablonowa.