Jaka jest różnica między klasą szablonu a szablonem klasy?

85

Jaka jest różnica między klasą szablonu a szablonem klasy?

koder
źródło

Odpowiedzi:

125

Jest to częsty problem dla wielu osób (w tym strona programowania ogólnego w Wikipedii, niektóre samouczki C ++ i inne odpowiedzi na tej stronie). Jeśli chodzi o C ++, nie ma czegoś takiego jak „klasa szablonu”, istnieje tylko „szablon klasy”. Sposobem na odczytanie tego wyrażenia jest „szablon dla klasy”, a nie „szablon funkcji”, który jest „szablonem funkcji”. Ponownie: klasy nie definiują szablonów, szablony definiują klasy (i funkcje). Na przykład to jest szablon , a konkretnie szablon klasy , ale to nie jest klasa :

template<typename T> class MyClassTemplate
{ 
    ...
};

Deklaracja MyClassTemplate<int> jest klasą lub pedantycznie klasą opartą na szablonie. Nie ma specjalnych właściwości klasy opartej na szablonie w porównaniu z klasą nieopartą na szablonie. Specjalne właściwości dotyczą samego szablonu .

Wyrażenie „klasa szablonu” nic nie znaczy, ponieważ słowo „szablon” nie ma znaczenia jako przymiotnik, gdy jest stosowane do rzeczownika „klasa” w C ++. Oznacza to istnienie klasy, która jest (lub definiuje) szablonem , a nie pojęciem istniejącym w C ++.

Rozumiem powszechne zamieszanie, ponieważ prawdopodobnie opiera się ono na fakcie, że słowa pojawiają się w kolejności „klasa szablonowa” w rzeczywistym języku, co jest zupełnie inną historią.

Niepewny
źródło
+1. Czasami z jakiegoś powodu przydatne jest rozróżnienie „pochodzenia” klasy. W takim przypadku możesz rozsądnie użyć terminu „klasa szablonu” - ale z powodów, które podałeś, dobrze jest dokładnie zdefiniować, co przez to rozumiesz .
j_random_hacker
1
@j_random_hacker - zobacz odpowiedź litb poniżej, ale w skrócie, preferowanym terminem na to jest „specjalizacja w szablonie klas”
nie wiem,
@Not Sure: Cóż, właściwie uważam, że „specjalizacja szablonu klas” jest nieco niejednoznaczna, ponieważ może również odnosić się do procesu definiowania jawnej lub częściowej specjalizacji szablonu - coś, co nie jest potrzebne do stworzenia rzeczywistej „klasy”. :) IMHO „instancja szablonu klasy” to najwyraźniejszy termin.
j_random_hacker
2
@j_random_hacker: Jest na to odpowiedni termin - „jawna specjalizacja w szablonach klas” i „częściowa jawna specjalizacja w szablonach klas”. Uciążliwe, ale nie dwuznaczne :)
Nie wiem
1
−1 Terminy oznaczają to, co znaczą dla ludzi, którzy ich używają. Rozpoczęcie analizy dosłownych znaczeń jest bez znaczenia. Po prostu spróbuj z każdym innym terminem z życia codziennego lub inżynierii. Podsumowując, ta odpowiedź to bzdura. Odpowiedź SHH , cytując Bjarne, jest OK.
Pozdrawiam i hth. - Alf
13

Bjarne Stroustrup, twórca C ++, mówi w swojej książce The C ++ Programming Language 4th edition , 23.2.1 Defining a Template:

Są ludzie, którzy dokonują semantycznych rozróżnień między szablonem klasy a klasą szablonu . Ja nie; byłoby to zbyt subtelne: rozważ te terminy zamiennie. Podobnie uważam szablon funkcji za wymienny z funkcją szablonu .

SHH
źródło
12

Różnica polega na tym, że termin „klasa szablonu” po prostu nie istnieje w standardzie C ++. Jest to termin używany głównie przez ludzi, którzy uważają, że termin „szablon klasy” jest mylący (np. Firmy Qt - Nokia i dawniej Trolltech).

Standard nie ma na to żadnego pojęcia, więc to inne narody muszą coś zmienić. Niektórzy używają go jako synonimu, a inni twierdzą, że termin „klasa szablonu” odnosi się do utworzonego lub jawnie wyspecjalizowanego szablonu klasy, co byłoby równoznaczne z terminem „specjalizacja szablonu klas”. Historycznie miało to znaczenie. Podręcznik z adnotacjami definiuje na stronie 343

Klasa wygenerowana z szablonu klasy jest nazywana klasą szablonu, podobnie jak klasa specjalnie zdefiniowana z nazwą klasy szablonu jako nazwą

Non-końcowy szablon klasy-name jest równoważny non-końcowej Template-ID używany w dzisiejszym standardowe i zstępuje template-name < arguments >.


Zapoznanie się z dzisiejszymi terminami, co jest ważniejsze niż używanie wątpliwych starych terminów

// (1) defines a class template
template<typename T> class A { }; 

// (2) defines a class template explicit specialization 
template<> class A<int> { };

// (3) defines a class template partial specialization
template<typename T> class A<T*> { };

// (4) explicitly instantiates A<char>. 
template class A<char>;

// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
  • ARM nazwał klasę (2), a klasy wygenerowane przez (4) i (5) klasą szablonu . Nie jestem pewien, czy ARM wiedział już o częściowych specjalizacjach. Ale jeśli tak, (3) nie został nazwany klasą szablonową, ponieważ (3) nie definiuje klasy, ale definiuje szablon.
  • Obecny Standard wywołuje klasę (2), a te generowane przez specjalizacje szablonów klas (4) i (5) . A (3) nazywa się specjalizacją częściową , w przeciwieństwie do wyraźnej specjalizacji . Czasami nazywa się to również (3) specjalizacją (3,2 / 5 - jednak z wyjaśnieniem powiązań), chociaż nie jest to dla mnie całkowicie jasne, ponieważ definiuje „specjalizację” jako „klasę, funkcję lub klasę” member ”, co (3) nie spełnia.
Johannes Schaub - litb
źródło
3
Hehe. Tak, i kilku innych nadal ma swój udział w tym zestawie. W szczególności C ++ Faq lite i dokumentacja Qt. Autor faq lite powiedział mi w e-mailu, że chce zamieścić kolejny element FAQ wyjaśniający, że użycie słowa „specjalizacja” jest lepsze, ponieważ powoduje mniej zamieszania (używając „wyraźnej specjalizacji” dla rodzaju specjalizacji napisanej przez użytkownika, następnie). Faceci z Qt powiedzieli mi, że nie chcą używać terminu „szablon klasy”… uważają go za „nienaturalny”. Szkoda.
Johannes Schaub - litb
@ JohannesSchaub-litb: ARM zostało napisane przez Bjarne Stroustrup i Margaret Ellis, mniej więcej w 1991 IIRC. Twój cytat z ARM zaprzecza cytatowi SHH z 4. edycji TCPPL Bjarne'a . Dlatego dobrze, że dokonałeś rozróżnienia między starą (przed standardową) a obecną terminologią.
Pozdrawiam i hth. - Alf
7

Klasa szablonu jest powiązana ze wzorcem projektowym metody szablonu , podczas gdy szablon klasy jest po prostu szablonem klasy „wypełnij puste miejsca”.

Peter Perháč
źródło
1

Szablon klasy to szablon używany do generowania klas, podczas gdy klasa szablonu to klasa tworzona przez szablon.

DEBALINA MAHATA
źródło
0

Klasa szablonu: Klasa, która ma definicję ogólną lub klasę z parametrami, której instancja nie jest tworzona, dopóki informacje nie zostaną dostarczone przez klienta. Odnosi się do żargonu dla zwykłych szablonów. Po prostu klasa z szablonem prefiksu i użycie T. Szablon klasy: Indywidualna konstrukcja klasy jest określona przez szablon klasy, który jest prawie podobny do sposobu, w jaki poszczególne obiekty są konstruowane przy użyciu klasy. Odnosi się do obiektu klasy szablonu Ex- nazwa klasy nazwa_obiektu (lista argumentów)

Rishabh
źródło
0

Szablon klasy to ogólna klasa dla różnych typów obiektów. Zasadniczo zawiera specyfikację generowania klas na podstawie parametrów. Za każdym razem, gdy tworzony jest nowy obiekt, w pamięci pojawi się nowa klasa. Nazywa się to tworzeniem wystąpienia szablonu klasy, a każda utworzona wersja klasy jest nazywana klasą szablonu.

BlackList96
źródło
0

Spójrz na ten artykuł (z wg21 i został opublikowany w 1992) :

Spójna terminologia

Wiele dotychczasowych argumentów i sporów dotyczyło terminologii używanej w rozdziale opisującym szablony. Najczęściej stosowano różne określenia „szablon funkcji” i „funkcja szablonu” w celu wyrażenia różnych pomysłów i zamiarów. Ponieważ nie zastosowano spójnego nazewnictwa, wynikiem jest zamieszanie i kłótnia.

Do celów niniejszego dokumentu, jako propozycja formalnego przyjęcia przez komisję podczas dyskusji na temat szablonów oraz w celu wyjaśnienia dokumentacji; Proponuję przyjąć formalizację, zgodnie z którą końcowy „-szablon” opisuje zestaw typów lub funkcji opisanych przez szablon. I że wiodący „ szablon-” jest używany do opisania definicji szablonu części „-szablonu” , na przykład 'template-member-function'. Zatem: -

  • „szablon funkcji”: zbiór funkcji opisanych przez szablon, parametrycznych na podstawie informacji o typie dostarczonych jako argument tego szablonu. Na przykład :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
  • „szablon-klasy”: zbiór klas opisanych przez szablon, parametryczny na podstawie pewnych informacji o typie dostarczonych jako argument do tego szablonu. Na przykład :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
  • „funkcja-szablonu”: ten termin nie jest już dozwolony. **
  • „template-class”: ten termin jest niedozwolony. **

  • „Szablon funkcji elementu członkowskiego”: ten termin jest niedozwolony, ponieważ opisuje właściwość, która nie jest obecnie obsługiwana przez definicję szablonu. Używając powyższej konwencji terminologicznej, opisałoby to członka szablonu innego niż klasa, którego definicja sama w sobie była szablonem. Na przykład :-

class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};

Ponieważ jednak szablony są obecnie ograniczone do zakresu globalnego, taki szablon jest nieprawidłowy.

  • „template-static-member-function”:
  • „szablon-element-funkcja”:
  • „template-static-member”:
  • „template-static-data-member ” template-member ”: Alternatywne terminy dla definicji członka występujące oddzielnie od„ szablonu klasy ”, do którego on należy. Na przykład :-
template<class T> int S<T>::sep_member()
{ return i; }
陳 力
źródło
O Normalklasie, którą opisałeś powyżej: Nie wiedziałem, że taki szablon funkcji składowej jest zabroniony. Jest akceptowany przez wszystkie kompilatory, których próbowałem. czego mi brakuje?
dan_din_pantelimon