Je peux utiliser des modèles et supprimer des fonctions pour empêcher l'appel de factoriel avec des variables de type caractère ou flottant comme suit. Comment écrire la fonction de suppression pour les factoriels avec des arguments négatifs?Utilisation de delete pour empêcher les appels avec des valeurs non valides en C++ 14
template <typename T>
constexpr T factorial(T n)
{
return (n == 1 || n == 0) ? 1 : (n * factorial(n - 1));
}
constexpr float factorial(double) = delete;
constexpr char factorial(char) = delete;
int main()
{
constexpr auto fiveFactorial = factorial(5);
constexpr auto point5fact = factorial(0.5); // Error. Call to deleted version
constexpr auto letter5fact = factorial('5'); // DITTO
constexpr auto minusFact = factorial(-1); // How to prevent this using delete?
}
Vous ne pouvez pas, puisque la valeur est évaluée * runtime *. C'est correct avec les types, puisqu'ils sont connus au moment de la compilation, mais vous ne pouvez pas obtenir d'erreurs de compilation pour des choses qui sont seulement connues à l'exécution. La seule solution que je peux voir est de s'assurer que 'T' est un type * unsigned *. –
Une autre solution possible, si vous voulez seulement autoriser les types entiers non signés, est de * déclarer * la fonction générique mais de ne pas l'implémenter (ou peut-être même la marquer comme effacée?). Ensuite, spécialisez la fonction pour les types entiers non signés avec une définition (implémentation). –