2016-08-25 18 views
6

durumda aşağıdaki düşünün:İşlev şablonunun açık uzmanlaştırmasında şablon parametresi nasıl çıkarılır?

#include <iostream> 

template <class T> void f(T) { std::cout << "#1\n"; } // #1 
template <> void f(const int) { std::cout << "#2\n"; } // #2 

int main() { 
    f<const int>(1); // call #1 
    f<int>(1);  // call #2 
    return 0; 
} 

O 2. f<int>(const int) yerine f<const int>(const int) gibi görünüyor. Burada ne var? İlk düşüncem üst düzey const işlev türü dönüşümde atıldı, böylece # 2 tipi void(int), f<int>(const int) özelleştirme ile sonuçlanır. Ama bundan emin değilim.

Ve neden C++ böyle bir sözdizimine izin veriyor? Demek istediğim, fonksiyon şablonlarını uzmanlaştıramazsak, açık bir şekilde uzmanlaşmak istiyorsak, şablon argüman değerini biliyor olurduk. Öyleyse, C++ sadece programcıyı şablon fonksiyonlarını uzmanlaştırırken açık bir şekilde şablon argüman değerleri sağlıyor mu? (yani template <> void f<int>(const int) { } veya template <> void f<int const>(const int) { } numaralı telefondan # 1 uzmanlık yazmalıyız) Kodlama kolaylığı dışında özel kullanım var mı? şablonların sorunu bir kenara bırakarak

cevap

6
void f(const int p) 

, şu an için const bölümü burada f() parametrenin türünü belirtmez. Tüm bu const tüm belirtir pf() işlevinin içinde const olduğunu. Parametrenin f()'a göre türü int'dur.

template <> void f(const int) 

derleyici uzmanlık tipini anlamak için çalışıyor, bu fonksiyon parametrenin tipi int olduğundan, bu f<int> için uzmanlık olması gerektiğini ortaya çıkarır.

Bu şekilde kesinti yapamazsınız. Açık olmak zorundasınız, eğer yapmak istediğiniz şey buysa:

template <> void f<const int>(const int) { std::cout << "#2\n"; } 
İlgili konular