我想控制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); }
有更好的方法吗?
答案 0 :(得分:1)
不,没有更好的方法。更好的方法是采用自定义流操纵器的形式,如std::hex
。然后,您可以关闭和打开整数打印,而无需为每个数字指定它。但是自定义操纵器在流本身上运行,并且没有任何format flags可以执行您想要的操作。我想你可以编写自己的流,但这比你现在做的更多。
老实说,最好的办法是看看你的文本编辑器是否具有使static_cast<int>
更容易输入的功能。我假设你要打字很多,否则你不会问。这样,读取您的代码的人确切地知道您的意思(即,将char打印为整数),而无需查找自定义函数的定义。
答案 1 :(得分:1)
只是对旧帖子的更新。实际的诀窍是使用&#39; +&#39;。例如:
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;
}
答案 2 :(得分: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;
}
答案 3 :(得分:0)
在C ++ 20中,您将可以使用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)
在此期间,您可以使用the {fmt} library,std::format
是基于。
免责声明:我是{fmt}和C ++ 20 std::format
的作者。