2012-11-29 20 views

cevap

48

Kullanım is_same:

#include <type_traits> 

template <typename T> 
void foo() 
{ 
    if (std::is_same<T, animal>::value) { /* ... */ } // optimizable... 
} 

Genellikle bu olsa tamamen işlemez bir dizayn ve uzmanlaşmak gerçekten istiyorum:

template <typename T> void foo() { /* generic implementation */ } 

template <> void foo<animal>() { /* specific for T = animal */ } 

Not da onunla işlev şablonları olması alışılmadık olduğunu açık (çıkarımsız) argümanlar. Hiç duyulmuyor, ama çoğu zaman daha iyi yaklaşımlar var.

+0

TThanks! Aslında çok fazla kod paylaşıyor, bu yüzden gerçekten kopyalayamıyorum – WhatABeautifulWorld

+1

@WhatABeautifulWorld: Kodunuza her zaman katılabilirsiniz, böylece türeve bağlı kısım, özelleştirilebilir bir fonksiyona yönlendirilebilir. –

+0

Eğer bir std :: is_same kullanın, sonra diğer şablon parametreleri için kodu yavaşlatmayacak, değil mi? – WhatABeautifulWorld

5

Böyle onların parametreye geçirilen unsurları temel alarak Şablonlarınızı uzmanlaşabilir: Bu T olarak geçirilen türüne göre tamamen yeni bir fonksiyon oluşturur

template <> void foo<animal> { 

} 

Not. Bu genellikle dağınıklığı azalttığı için tercih edilir ve esas olarak ilk etapta şablonlara sahip olmamızın sebebidir.

+0

Hmm. Bu yöntem gerçekten şablon argümanı uzmanlaşmak için tercih edilen tek yol mu? Şablon fonksiyonunda yönetmem gereken 10 farklı çocuk sınıfım olduğunu varsayalım. İlgili sınıf için 10 farklı şablon işlevi yazmam gerekiyor mu? Buradaki temel noktayı kaçırıyor olabilirim. –

3

Bugünün kullanımının daha iyi olduğunu düşünüyorum ama sadece C++ 17 ile. Eğer constexpr olmadan eğer ifade vücutta bazı tip spesifik işlemleri kullanırsanız

#include <type_traits> 

template <typename T> 
void foo() { 
    if constexpr (std::is_same_v<T, animal>) { 
     // use type specific operations... 
    } 
} 

, bu kod derlemek olmaz.

+1

yerine "std :: is_same :: value" daha kısa kullanabilirsiniz: std :: is_same_v ' – Fureeish

+0

yep is_same_v, teşekkürler –

İlgili konular