c++ - lenguaje - imprimir caracteres en c
Impresión de caracteres como enteros (3)
No, no hay una mejor manera. Una mejor forma tomaría la forma de un manipulador de flujo personalizado, como std::hex
. Luego, puede activar y desactivar su impresión entera sin tener que especificarla para cada número. Pero los manipuladores personalizados operan en la transmisión en sí, y no hay indicadores de formato para hacer lo que desee. Supongo que podrías escribir tu propia transmisión, pero eso es mucho más trabajo de lo que estás haciendo ahora.
Honestamente, su mejor opción es ver si su editor de texto tiene funciones para hacer que static_cast<int>
sea más fácil de escribir. Supongo que de otra manera lo escribirías mucho o no estarías preguntando. De esa forma, alguien que lea tu código sabe exactamente lo que quieres decir (es decir, imprimir un carácter como un entero) sin tener que buscar la definición de una función personalizada.
Quiero controlar si mi salida ostream
de char
sy unsigned char
''s a través de <<
escribe como caracteres o enteros . No puedo encontrar esa opción en la biblioteca estándar. Por ahora he vuelto a utilizar sobrecargas múltiples en un conjunto de funciones de impresión alternativas
ostream& show(ostream& os, char s) { return os << static_cast<int>(s); }
ostream& show(ostream& os, unsigned char s) { return os << static_cast<int>(s); }
¿Hay una mejor manera?
Solo una actualización de una publicación anterior. El truco real es usar ''+''. P.ej:
template <typename T>
void my_super_function(T x)
{
// ...
std::cout << +x << ''/n''; // promotes x to a type printable as a number, regardless of type
// ...
}
En C ++ 11 puedes hacer:
template <typename T>
auto promote_to_printable_integer_type(T i) -> decltype(+i)
{
return +i;
}
Crédito: ¿Cómo puedo imprimir un char como un número? ¿Cómo puedo imprimir un carácter * para que el resultado muestre el valor numérico del puntero?
Tengo una sugerencia basada en la técnica utilizada en cómo imprimir una char sin firmar como hex en c ++ usando ostream? .
template <typename Char>
struct Formatter
{
Char c;
Formatter(Char _c) : c(_c) { }
bool PrintAsNumber() const
{
// implement your condition here
}
};
template <typename Char>
std::ostream& operator<<(std::ostream& o, const Formatter<Char>& _fmt)
{
if (_fmt.PrintAsNumber())
return (o << static_cast<int>(_fmt.c));
else
return (o << _fmt.c);
}
template <typename Char>
Formatter<Char> fmt(Char _c)
{
return Formatter<Char>(_c);
}
void Test()
{
char a = 66;
std::cout << fmt(a) << std::endl;
}