2017-07-21 41 views
7

Sadece temel türler için şablon uzmanlığı yapmanın bir yolu var mı? Aşağıdaki yapmaya çalıştık:Temel türler için şablon uzmanlaşımı

template<typename T, typename = typename std::enable_if<!std::is_fundamental<T>::value>::type> 
class foo 
{ 
} 

template<typename T, typename = typename std::enable_if<std::is_fundamental<T>::value>::type> 
class foo 
{ 
} 

Ama şablon zaten tanımlandığını bir hata alıyorum.

+0

Olası kopyalar https://stackoverflow.com/questions/15427667/ sfinae-in-return-type-değil-şablon-parametre olarak çalışma) –

+0

@EdgarRokyan Bir çift değil; Biri fonksiyonları ile uğraşmak, bu – Justin

+0

@Justin sınıfları ile ama prensip aynı olmalıdır, değil mi? –

cevap

15

Burada, uzmanlıkla değil, aynı ada sahip iki şablonlu sınıflar oluşturuyorsunuz.

Bunu uzmanlaşmak sonra genel bir tane oluşturun ve gerekir:

// not specialized template (for non-fundamental types), Enabler will 
// be used to specialize for fundamental types 
template <class T, class Enabler = void> 
class foo { }; 

// specialization for fundamental types 
template <class T> 
class foo<T, std::enable_if_t<std::is_fundamental<T>::value>> { }; 
[SFINAE ancak şablon parametre olarak dönüş türü çalışan] (içinde
+0

çok teşekkür ederim :) –

+4

Gerçekten * '' is_fundamental' için uzmanlaşmanız gerekiyor mu? Birincil şablonu kullanabilirsiniz. – Rakete1111

+0

Paylaşılan_ptrs için birincil şablonu kullanıyorum, lockfree değerlerini saklamak için bir model yapıyorum. –