2017-07-21 34 views
7

Czy istnieje sposób na specjalizację szablonów tylko dla typów podstawowych? Próbowałem wykonać następujące czynności:Specjalizacja szablonów dla typów podstawowych

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 
{ 
} 

Ale ja dostaję błąd, że szablon jest już zdefiniowany.

+0

Możliwy duplikat [SFINAE pracuje w rodzaju powrót, ale nie jako parametr szablonu] (https://stackoverflow.com/questions/15427667/ parametr "sfinae-working-in-return-type-but-not-as-template") –

+0

@EdgarRokyan Not a dup; ten ma do czynienia z funkcjami, ten z klasami – Justin

+0

@Justin, ale zasada powinna być taka sama, prawda? –

Odpowiedz

15

Tutaj tworzysz dwie klasy szablonów o tej samej nazwie, a nie specjalizacjach.

Musisz utworzyć rodzajowe jeden, a następnie specjalizować go:

// 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>> { }; 
+0

dziękuję bardzo :) –

+4

Czy * naprawdę * musisz specjalizować się w '! Is_fundamental'? Możesz po prostu użyć głównego szablonu. – Rakete1111

+0

Używam szablonu podstawowego dla shared_ptrs, buduję wzór do przechowywania wartości lockfree. –

Powiązane problemy