Le message d'erreur explique le problème - un tableau est converti en un pointeur (au premier élément) lorsqu'il est passé comme argument à une fonction.
Une solution consisterait à passer un type struct
qui a deux membres, et donner une valeur par défaut. Un exemple serait, puisque std::array
est en fait une structure basé sur un modèle
void input_number(int* variable, std::string text = "Input : ", const std::array<int, 2> &bounds = {});
int variable;
input_number(&variable, "Choose a number between 0 and 10 : ", {0, 10});
Cependant, toute structure de données qui permet de stocker deux valeurs, et être construit à l'aide d'un initializer_list<int>
. Il existe d'autres exemples de ces types dans la bibliothèque standard - std::array
n'est pas le seul.
Personnellement, j'omettre aussi le premier argument, et ont comme valeur de retour
int input_number(std::string text = "Input : ", const std::array<int, 2> &bounds = {});
// to call
int variable = input_number("Choose a number between 0 and 10 : ", {0, 10});
Cela a le problème de la fonction de ne pas être en mesure de signaler une erreur (autre que en lançant une exception), mais votre approche aussi.
Personnellement, je ne voudrais pas non plus passer les limites comme arguments par défaut. Je le ferais simplement avec une surcharge de fonction;
int input_number(std::string input, int lower_bound, int upper_bound)
{
// do whatever you want
}
int input_number(std::string input)
{
return input_number(input, std::numeric_limits<int>::min(), std::numeric_limits<int>::max());
}
qui oblige l'appelant à fournir soit aucun argument après le premier (dans ce cas, les limites par défaut sont utilisées) ou deux (qui spécifient les bornes) - faire passer un seul argument supplémentaire serait une erreur diagnostiquée. La seule différence par rapport à ce que vous avez demandé est que cela ne nécessite pas (implicitement ou explicitement) de construire un tableau ou une autre structure de données pour appeler la fonction - ce qui est sans doute plus facile à gérer pour l'appelant.
Merci pour la réponse détaillée! Beaucoup de suggestions supplémentaires, je l'aime. Et oui, même si je voulais éviter la surcharge de fonctions, je suppose que je n'ai définitivement aucun autre choix que de les utiliser! – lolgab123
Il suffit de lire, avec la façon dont vous venez d'écrire que la surcharge ne prend pas plus d'espace que sans surcharger .. très belle solution merci! (+ il y a une parenthèse fermée supplémentaire dans le dernier bloc de code, juste après l'entrée, qui peut être enlevée) – lolgab123