2017-07-21 1 views
7

Est-il possible de faire une spécialisation de gabarit pour les types fondamentaux uniquement? J'ai essayé de faire ce qui suit:Spécialisation de gabarit pour les types fondamentaux

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

Mais je reçois une erreur que le modèle est déjà défini.

+0

double possible de [SFINAE travaillant dans le type de retour, mais pas en tant que paramètre de modèle] (https://stackoverflow.com/questions/15427667/ sfinae-working-in-return-type-mais-not-as-template-parameter) –

+0

@EdgarRokyan Pas un dup; que l'on a affaire à des fonctions, celle-ci avec des classes – Justin

+0

@Justin mais le principe devrait être le même, non? –

Répondre

15

Ici, vous créez deux classes modèles avec le même nom, et non des spécialisations.

Vous devez créer un générique puis spécialiser:

// 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

merci beaucoup :) –

+4

Avez-vous * vraiment * besoin de vous spécialiser pour '! Is_fundamental'? Vous pouvez simplement utiliser le modèle principal. – Rakete1111

+0

J'utilise le template primaire pour shared_ptrs, je construis un pattern pour stocker des valeurs lockfree. –