2016-03-22 16 views
3

Neden yalnızca ilk uygulama çalışıyor ve aşağıda belirtilen diğer uygulamalar değil, Birisi bu şablon yapısının çalışma şeklini ve neden başkalarının yapmadığını açıklayabilir. çalışmayanAynı adla ve farklı Şablon bağımsız değişkenleriyle iki yapı nasıl çalışır?

template <typename T, typename U> 
struct is_same 
{ 
    static const bool value = false; 
}; 

template <typename T> 
struct is_same<T, T> 
{ 
    static const bool value = true; 
}; 

Şablon yapılarını çalışmak

Şablon yapılar

template <typename T, typename U> 
struct is_same<T, U> 
{ 
    static const bool value = false; 
}; 

template <typename T> 
struct is_same<T, T> 
{ 
    static const bool value = true; 
}; 

Bir çalışmadığını daha

template <typename T, typename U> 
struct is_same<T,U> 
{ 
    static const bool value = false; 
}; 

template <typename T> 
struct is_same 
{ 
    static const bool value = true; 
}; 

Ve Ana Fonksiyon

template <class A, class B> 
bool IsSameClass() { 
    return is_same<A, B>::value; 
} 
int main() 
{ 
    bool ret = IsSameClass<P,C>(); 
} 
+0

Şablona bakın ** uzmanlık **. – Jarod42

cevap

6

Her zaman bir şablon tanımı ile başlamak:

template <class T, class U> 
class is_same { ... }; 

Veya Jarod42 bildirisi ile, hatırlattı gibidir:

template <class T, class U> class is_same; 

varmış bir şablon var, kısmi uzmanlığını tanımlayabilirsiniz, örnek argümanlarınızda olduğu gibi, bir veya daha fazla şablon argümanı inceleyerek:

template <class T> 
class is_same<T, T> { ...}; 

uzmanlaşma hala sadece orijinal şablon gibi, iki bağımsız değişkeni alır, ancak aynı tip, o yüzden tanım template <...> bölümünde sadece tek bir tür adı var.

Kullanımda, is_same<int, double> şablon tanımıyla eşleşir; is_same<int, int> kısmi uzmanlık ile eşleşir.

Ayrıca tam bir uzmanlık belirtebilirsiniz. Eğer Buraya istiyorum, ama bu örnekle aşağıdaki birşey değil:

template <> 
class is_same<void, void> { ... }; 

Bu is_same<void, void>, belli ki, eşleşir.

Diğer iki denemenin çalışmadığı nedeni, bunların hiçbirinin yalnızca özelleştirme gibi görünen şeyler tanım şablonuna sahip olmamasıdır. Bir tanım olmadan uzmanlaşacak bir şey yok.

Bunun bir aşırı basitleştirmenin bir parçası olduğunu unutmayın. “Bu şeyleri neden işe yaramıyor”, “bir şablonu nasıl uzmanlaştırabilirim?

+0

Sadece ** beyanı ile başlayabiliriz **. – Jarod42

+0

@ Jarod42 - evet, teşekkürler. Bunu ekledim. –

+0

@pete Becker Bir ton teşekkürler, bir şablonu nasıl uzmanlaştıracağınızı da açıklayabilir misiniz? – user2256825

1

template <typename T, typename U> 
struct is_same<T, U> 
{ 
    static const bool value = false; 
}; 

sözdizimi sınıf şablonu bir uzmanlık oluşturmak için kullanılır. Bunu yapabilmek için öncelikle önce şablonu bildirmeniz veya genel tanımını oluşturmanız gerekir.

template <typename T, typename U> struct is_same; 

veya

template <typename T, typename U> 
struct is_same 
{ 
    static const bool value = false; 
}; 

Eğer is_same<int, float> ile başlatılamaz zaman hangi şablonun karar vermek yolu yoktur çünkü
template <typename T, typename U> 
struct is_same<T, U> 
{ 
    static const bool value = false; 
}; 

geçerli bir uzmanlık değil, bunu yaptı bile.

Şablonlar kullanarak aşırı edilemez:

template <typename T, typename U> 
struct is_same 
{ 
    static const bool value = false; 
}; 

template <typename T> 
struct is_same 
{ 
    static const bool value = true; 
}; 

dil sadece o izin vermez.

İlgili konular