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 }