将字符打印为整数

问题描述 投票:0回答:4

我想控制我的

ostream
通过
char
输出
unsigned char
<<
是否将它们写为字符整数。我在标准库中找不到这样的选项。现在我已经恢复在一组替代打印函数上使用多个重载

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); }

有更好的方法吗?

c++ formatting ostream interpretation
4个回答
1
投票

不,没有更好的方法。更好的方法是采用自定义流操纵器的形式,例如

std::hex
。然后,您可以关闭和打开整数打印,而不必为每个数字指定它。但是自定义操纵器对流本身进行操作,并且没有任何“格式标志”来执行您想要的操作。我想您可以编写自己的流,但这比您现在所做的工作要多。 老实说,您最好的选择是查看您的文本编辑器是否具有使

static_cast<int>

更易于键入的功能。我想你会经常输入它,否则你就不会问。这样,阅读您代码的人就可以确切地知道您的意思(即将字符打印为整数),而无需查找自定义函数的定义。

    


1
投票

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 // ... }

在 C++11 中你可以这样做:

template <typename T> auto promote_to_printable_integer_type(T i) -> decltype(+i) { return +i; }

信用:
如何将字符打印为数字?如何打印 char* 以便输出显示指针的数值?

适用于
有符号/无符号字符

    https://godbolt.org/z/6rG3x8snT

0
投票
how do I print an unsigned char as hex in c++ using 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; }



0
投票

std::format

 来执行此操作:
unsigned char uc = 42; std::cout << std::format("{:d}", uc); // format uc as integer 42 (the default) std::cout << std::format("{:c}", uc); // format uc as char '*' (assuming ASCII)

同时您可以使用 
{fmt} 库

std::format 是基于的。

免责声明

:我是 {fmt} 和 C++20 的作者std::format

    

© www.soinside.com 2019 - 2024. All rights reserved.