Bir şablon sınıf ve bir sınıf şablonu arasındaki fark nedir?
Yanıtlar:
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.
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 .
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; };
Bir şablon sınıfı, Şablon Yöntemi tasarım deseniyle ilgilidir , sınıf şablonu ise yalnızca "boşlukları doldurma" sınıf şablonudur.
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.
Ş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
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.
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?