背景:
我有模板流运算符(例如operator << (ostream &, std::vector <T>)
) (输出容器元素可能是一些8位整数类型(例如unsigned char
、int_least8_t
等))。
问题:
默认情况下,这些类型输出为char
(ASCII)。我只对ASCII型变量使用了char
(或wchar_t
等),从未使用过无符号/有符号类型。如何让这些其他8位类型始终输出为signed int
/ unsigned int
(numbers),即使调用者不知道该类型?
第一次尝试:
我已经尝试过(和GCC一起),例如,在operator << (ostream &, unsigned char)
中定义一个强制转换(即stream << static_cast <int> (value)
)。这对unsigned char
值有效,但是uint8_t
仍然以char
的形式输出。
相同的底层类型(例如,unsigned/signed char
不能在重载中使用,因此我不能定义例如operator << (ostream &, int_fast8_t)
的重载。
发布于 2010-10-29 15:53:05
我想到的一种方法是使用类型特征来定义每种类型的输出类型。对于每种类型,您都必须手动声明。可以将特征定义为模板结构,该结构专用于具有与数据类型本身不同的输出类型的每个数据类型:
template< T >
struct output_trait {
typedef const T & output_type;
}
在运算符中,您可以这样写:
std::cout << static_cast< output_trait< T >::output_type >( variable ) << std::endl;
默认情况下,这不会进行强制转换,但对于output_trait
专门化的类型,它将进行强制转换:
template<>
struct output_trait< unsigned char > {
typedef unsigned int output_type;
}
发布于 2010-10-29 16:00:39
您混淆了保存在变量中的实际数据与您选择打印它的任何表示形式。
可以这样想:chars
、ints
、doubles
、longs
等等,它们都只是你用来存储数字的内存区块。字符是一个介于0和255 (或-128和127)之间的数字--您可以选择将其表示为ASCII字符、数字或借助OpenGL表示为天空中的星星。
如果您想查看字符'a‘后面的数字,只需指示您的程序将该内存块(对于您而言包含一个'a')视为一个数字。使用强制转换。这里:
http://www.cplusplus.com/doc/tutorial/typecasting/
看看这是否有帮助!
发布于 2010-10-29 15:52:44
如果我没理解错的话..输出如下:
std::cout << ( unsigned int )char << '\n';
或更多c++样式-使用static_cast,例如:
int main()
{
char a = 'a';
char b = 97;
std::cout << static_cast< unsigned int >( a ) << '\n';
std::cout << static_cast< unsigned int >( b ) << '\n';
return 0;
}
两个std::cout
将打印相同的内容:第一个是'a'
:97
的ASCII码,第二个是存储在b中的值97
。a
和b
是完全相同的。
https://stackoverflow.com/questions/4049986
复制相似问题