Bir şablon sınıf ve bir sınıf şablonu arasındaki fark nedir?


88

Bir şablon sınıf ve bir sınıf şablonu arasındaki fark nedir?

Yanıtlar:


127

Bu, çoğu kişi için ortak bir kafa karışıklığı noktasıdır (Wikipedia'daki Genel Programlama sayfası, bazı C ++ eğitimleri ve bu sayfadaki diğer yanıtlar dahil). C ++ söz konusu olduğunda, "şablon sınıfı" diye bir şey yoktur, yalnızca bir "sınıf şablonu" vardır. Bu ifadeyi okumanın yolu, "işlev için bir şablon" olan "işlev şablonu" nun aksine, "bir sınıf için bir şablondur". Yine: sınıflar şablon tanımlamaz, şablonlar sınıfları (ve işlevleri) tanımlar . Örneğin, bu bir şablon , özellikle sınıf şablonu , ama öyle değil , bir sınıf :

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

Bildirim MyClassTemplate<int> bir sınıftır veya bilgece bir şablona dayalı bir sınıftır. Bir şablona dayalı bir sınıfın, bir şablona dayalı olmayan bir sınıfa göre hiçbir özel özelliği yoktur. Özel nitelikler şablonun kendisidir .

"Şablon sınıfı" ifadesi hiçbir şey ifade etmez, çünkü "şablon" sözcüğü, C ++ söz konusu olduğunda "sınıf" ismine uygulandığında sıfat olarak bir anlam taşımaz. Bir varlığını ima sınıfında ise (ya da tanımlar) bir şablon C ++ bulunan bir kavram değildir.

Yaygın karışıklığı anlıyorum, çünkü muhtemelen kelimelerin gerçek dilde "şablon sınıf" sırasında görünmesi gerçeğine dayanıyor ki bu tamamen başka bir hikaye.


+1. Bazen bir sınıfın "kökenini" ayırt etmek her ne sebeple olursa olsun yararlıdır, bu durumda makul bir şekilde "şablon sınıf" terimini kullanabilirsiniz - ancak verdiğiniz nedenlerden dolayı, bununla ne demek istediğinizi dikkatlice tanımlamak iyi bir fikirdir. .
j_random_hacker

1
@j_random_hacker - aşağıdaki litb'in cevabına bakın, ancak kısaca bunun için tercih edilen terim "sınıf şablonu uzmanlığı"
Emin Değil

@ Emin Değilim: Aslında ben "sınıf şablonu uzmanlaşması" nı biraz belirsiz buluyorum, çünkü bir şablon için açık veya kısmi bir uzmanlık tanımlama sürecini de ifade edebilir - gerçek bir "sınıf" üretmek için gerekli olmayan bir şey. :) IMHO "sınıf şablonu somutlaştırması" en açık terimdir.
j_random_hacker

2
@j_random_hacker: Bunun için uygun bir terim var - "açık sınıf şablonu uzmanlığı" ve "kısmi açık sınıf şablonu uzmanlığı". Hantal, ama belirsiz değil :)
Emin Değil

1
−1 Terimler, bu terimleri kullanan kişiler için ne ifade ettiklerini ifade eder. Kelimenin tam anlamıyla analiz etmeye başlamak anlamsızdır. Günlük hayattan veya mühendislikle ilgili herhangi bir terimle deneyin. Özetle, bu cevap hogwash. Bjarne'den alıntı yapan SHH'nin cevabı tamam.
Şerefe ve hth. - Alf

15

C ++ 'ın yaratıcısı Bjarne Stroustrup, The C ++ Programming Language 4th edition , 23.2.1 Defining a Template adlı kitabında şöyle diyor :

Terimler arasında anlamsal ayrımlar yapmak insan vardır sınıf şablonuna ve şablon sınıfta . Yapmıyorum; bu çok ince olur: lütfen bu terimlerin birbirinin yerine geçebilir olduğunu düşünün. Benzer şekilde, işlev şablonunun şablon işlevi ile değiştirilebilir olduğunu düşünüyorum .


13

Aradaki fark, "şablon sınıf" teriminin C ++ Standardında mevcut olmamasıdır. Çoğunlukla "sınıf şablonu" teriminin kafa karıştırıcı olduğunu düşünen insanlar tarafından kullanılan bir terimdir (Qt şirketleri Nokia ve eski adıyla Trolltech gibi).

Standart'ın bununla ilgili bir kavramı yoktur, bu yüzden bir fark yaratmak diğer insanlara kalmıştır. Bazı insanlar bunu eşanlamlı olarak kullanır ve diğerleri "şablon sınıf" teriminin başlatılmış veya açıkça özelleştirilmiş bir sınıf şablonuna atıfta bulunduğunu söyler, bu da onu "sınıf şablonu uzmanlığı" terimine eşdeğer yapar. Tarihsel olarak bu anlamı vardı. Açıklamalı Referans Kılavuzu sayfa 343 de tanımlar

Özel olarak tanımlanmış bir sınıf olarak bir sınıf şablondan üretilen bir sınıfı, bir şablon sınıfı olarak adlandırılır şablon sınıf adı adı olarak

Uçbirim - dışı şablon-sınıf-adı , bugünün Standardında kullanılan uçbirim - dışı şablon-kimliğine eşdeğerdir ve indirilir template-name < arguments >.


Şüpheli eski terimleri kullanmaktan daha önemli olan bugünkü terimlere aşina olmanızı sağlamak için

// (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, sınıfı (2) ve (4) ve (5) tarafından oluşturulan sınıfları bir şablon sınıf olarak adlandırdı . ARM'nin kısmi uzmanlıkları zaten bilip bilmediğinden emin değilim. Fakat eğer öyleyse (3) bir şablon sınıfı olarak adlandırılmamıştı, çünkü (3) bir sınıfı tanımlamıyor, ancak bir şablon tanımlıyor.
  • Geçerli Standart, sınıf (2) 'yi ve (4) ve (5) sınıf şablonu uzmanlıkları tarafından üretilenleri çağırır . Ve (3), açık bir uzmanlaşmanın aksine kısmi uzmanlaşma olarak adlandırılır . Ayrıca bazen (3) bir uzmanlık (3.2 / 5 - ancak çapraz bağlantıları açıklığa kavuşturarak) çağırıyor, ancak bunun benim için tamamen açık olmadığını görmeme rağmen, bir "uzmanlığı" bir "sınıf, işlev veya sınıf" olarak tanımladığı için üye ", ki (3) tatmin etmiyor.

3
Hehe. Evet ve diğerleri de bu sete katkıda bulunuyor. Özellikle C ++ Faq lite ve Qt belgeleri. SSS lite yazarı bana bir e-postada "uzmanlık" kelimesinin daha az kafa karışıklığına neden olduğu için daha iyi olduğunu açıklayan başka bir SSS öğesi daha koymak istediğini söyledi (kullanıcı tarafından yazılan uzmanlık türü için "açık uzmanlaşma" kullanarak, sonra). Qt çalışanları bana "sınıf şablonu" terimini kullanmak istemediklerini söylediler ... bunu da "doğal olmayan" buluyorlar. Çok kötü.
Johannes Schaub - litb

@ JohannesSchaub-litb: ARM, Bjarne Stroustrup ve Margaret Ellis tarafından yazılmıştır, kabaca 1991 IIRC. ARM elde ettiğiniz alıntı çelişen Bjarne TCPPL 4 baskısından Shh en alıntı . Bu yüzden eski (standart öncesi) ve güncel terminoloji arasında bir ayrım yapmanız iyi.
Şerefe ve hth. - Alf


1

Bir sınıf şablonu, sınıfları oluşturmak için kullanılan bir şablondur, oysa bir şablon sınıfı, bir şablon tarafından üretilen bir sınıftır.


0

Şablon sınıfı: Genel bir tanıma sahip olan bir sınıf veya bilgi istemci tarafından sağlanana kadar somutlaştırılmayan parametrelere sahip bir sınıf. Düz şablonlar için bir jargona atıfta bulunulur. Basitçe önek şablonu ve T kullanımı ile sınıf. Sınıf şablonu: Bir sınıfın bireysel yapısı, bir sınıf kullanılarak tek tek nesnelerin oluşturulma şekline neredeyse benzer olan bir sınıf şablonu tarafından belirlenir. Ex-classname nesne adı (argüman listesi) şablon sınıfının bir nesnesine başvurulur


0

Sınıf şablonu, farklı nesne türleri için genel bir sınıftır. Temel olarak, parametrelere dayalı sınıflar oluşturmak için bir belirtim sağlar. Ne zaman yeni bir nesne oluşturulsa, bellekte bu amaç için yeni bir sınıf yer alacaktır. Buna bir sınıf şablonunun somutlaştırılması adı verilir ve sınıfın her örneklenmiş sürümüne şablon sınıfı adı verilir.


0

Bu makaleye bir göz atın (wg21'den ve 1992'de yayınlandı) :

Tutarlı Terminoloji

Bugüne kadarki argüman ve anlaşmazlığın çoğu, şablonları açıklayan bölümde kullanılan terminoloji ile ilgili olmuştur. En sık, farklı fikirleri ve niyetleri ifade etmek için 'işlev şablonu' ve 'şablon işlevi'nin değişen uygulamaları olmuştur . Tutarlı bir adlandırma uygulanmadığından, sonuç kafa karışıklığı ve argümandır.

Bu belgenin amaçları doğrultusunda, komite tarafından şablonlar hakkındaki tartışmalarda resmi olarak benimsenmesi için bir teklif olarak ve belgelerin açıklığa kavuşturulması amacıyla; Sondaki bir '-template'in bir şablon tarafından tanımlanan bir dizi türü veya işlevi tanımladığı biçimlendirmeyi benimsemeyi öneriyorum . Ve bu öncü 'template-' , bir kısmının Description açıklamak için kullanılan '-template' gibi a, 'template-member-function'. Böylece :-

  • 'işlev şablonu': Bir şablon tarafından açıklanan, bu şablona bağımsız değişken olarak sağlanan bazı tür bilgilerine ilişkin parametrik işlevler kümesi. Örneğin :-
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
  • 'sınıf şablonu': Bir şablonla tanımlanan, bazı tür bilgilerine ilişkin parametrik, bu şablona bağımsız değişken olarak sağlanan sınıflar kümesi. Örneğin :-
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
  • "şablon işlevi": Bu terime artık izin verilmiyor. **
  • "şablon sınıfı": Bu terime izin verilmez. **

  • 'üye-işlev-şablonu': Şablon tanımıyla şu anda desteklenmeyen bir özelliği açıkladığından bu terime izin verilmez. Yukarıdaki terminoloji kuralı kullanılarak, bu, tanımı kendisi bir şablon olan, sınıf olmayan bir şablonun üyesini tanımlayabilir. Örneğin :-

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

Bununla birlikte, şablonlar şu anda genel kapsamla sınırlı olduğundan, böyle bir şablon geçersizdir.

  • 'şablon-statik-üye-işlevi':
  • 'şablon-üye-işlevi':
  • 'şablon-statik-üye':
  • 'şablon-statik-veri-üye ' şablon-üye ': Bir üyenin tanımı için ait olduğu' sınıf şablonundan 'ayrı görünen alternatif terimler. Örneğin :-
template<class T> int S<T>::sep_member()
{ return i; }

NormalYukarıda tarif ettiğiniz sınıf hakkında: Böyle bir üye-işlev-şablonunun yasaklandığını bilmiyordum . Denediğim tüm derleyiciler tarafından kabul edildi. Neyi kaçırıyorum?
dan_din_pantelimon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.