Affichage des caractères en tant qu’intts sans transtypage explicite

Chaque fois que j’envoie un caractère à l’object cout, il s’affiche en caractères ASCII sauf si je le convertis en int.

Q: Est-il possible d’afficher la valeur numérique d’un caractère sans transtypage explicite?

J’ai lu quelque part que trop de conversions dans votre code pourraient entraîner une perte d’intégrité (de votre programme). Je suppose que les caractères s’affichent en ASCII pour une raison particulière, mais je ne sais pas pourquoi.

Je crée essentiellement un jeu. J’utilise des petits nombres (caractères non signés) que je prévois d’afficher sur la console. Je suis peut-être paranoïaque, mais j’éprouve ce malaise chaque fois que je static_cast partout dans mon code.

Il n’y a cependant rien de mal à transtyper, en particulier si vous utilisez static_cast pour le faire. C’est ce que vous devriez utiliser. Cela permet au compilateur de valider la transtypage et de s’assurer de sa sécurité.

Pour changer le comportement de l’opérateur << , vous devez remplacer l'opérateur << par défaut pour les valeurs de caractère, par exemple:

 std::ostream& operator <<(std::ostream &os, char c) { os << static_cast(c); return os; } char c = ...; std::cout << c; 

Vous pouvez créer un type personnalisé qui prend un caractère en entrée, puis implémenter l'opérateur << pour ce type, par exemple:

 struct CharToInt { int val; CharToInt(char c) : val(static_cast(c)) {} }; std::ostream& operator <<(std::ostream &os, const CharToInt &c) { os << c.val; return os; } char c = ...; std::cout << CharToInt(c); 

Vous pouvez créer une fonction qui fait quelque chose de similaire, sans avoir à remplacer l'opérateur << , par exemple:

 int CharToInt(char c) { return c; } char c = ...; std::cout << CharToInt(c); 

Dans l’ensemble, il s’agit d’une utilisation raisonnable des moulages, mais elle peut effectivement être améliorée. La “perte d’intégrité” est simplement liée au fait que si l’un des types de données change de caractère, le doublage continue à être compilé mais ne fera probablement pas ce que vous voulez. Vous pouvez créer une fonction d’assistance à la place:

 inline int to_int(char c) { return static_cast(c); } 

Contrairement à static_cast, cela ne se déclenche que lorsque le type d’origine est char , donc si vous passiez à quelque chose comme double vous auriez un avertissement du compilateur – un rappel pour réviser votre code.