Modèle de classe pour les types numériques

Comment puis-je écrire un modèle de classe qui accepte uniquement les types numériques ( int , double , float , etc.) en tant que modèle?

Vous pouvez utiliser le trait de type std::is_arithmetic . Si vous voulez seulement activer l’instanciation d’une classe avec un tel type, utilisez-la en conjonction avec std::enable_if :

 #include  template< typename T, //real type typename = typename std::enable_if::value, T>::type > struct S{}; int main() { S s; //comstacks S s; //doesn't comstack } 

Pour une version de enable_if plus facile à utiliser et un ajout gratuit de disable_if , je vous recommande vivement de lire ce magnifique article (ou une version en cache ) sur le sujet.

ps En C ++, la technique décrite ci-dessus a un nom appelé “Échec de la substitution n’est pas une erreur” (la plupart utilisent l’acronyme SFINAE). Vous pouvez en savoir plus sur cette technique C ++ sur wikipedia ou cppreference.com .

J’ai trouvé que les messages d’erreur reçus du template très cryptiques (VS 2015), mais qu’un static_assert avec le même trait de type fonctionne également et me permet de spécifier un message d’erreur:

 #include  template  struct S { static_assert(std::is_arithmetic::value, "NumericType must be numeric"); }; template  NumericType add_one(NumericType n) { static_assert(std::is_arithmetic::value, "NumericType must be numeric"); return n + 1; } int main() { S i; S s; //doesn't comstack add_one(1.f); add_one("hi there"); //doesn't comstack }