2

背景:

我有模板流运算符(例如operator << (ostream &, std::vector <T>))(输出可能是某种 8 位整数类型的容器元素(例如unsigned char,,int_least8_t等等)。

问题:

默认是这些类型输出为char(ASCII)。我只使用char(或wchar_t其他)ASCII 变量,从不使用无符号/有符号类型。即使调用者不知道类型,如何让这些其他 8 位类型始终输出为signed int/ (数字)?unsigned int

第一次尝试:

例如,我尝试过(使用 GCC)在其中使用强制转换进行定义operator << (ostream &, unsigned char)(即stream << static_cast <int> (value). 这适用于unsigned char值,但随后uint8_t仍将输出作为char.

相同的底层类型(即unsigned/signed char不能在重载中使用,所以我不能定义例如operator << (ostream &, int_fast8_t).

4

5 回答 5

3

您将变量中保存的实际数据与您选择用于打印它的任何表示混淆了。

可以这样想:chars, ints, doubles, longs, 不管怎样,它们都是供您存储数字的内存块。 char 是介于 0 和 255(或 -128 和 127)之间的数字 - 您可以选择表示在 OpenGL 的帮助下,它可以作为 ASCII 字符、数字或天空中的星星。

如果您想查看字符“a”后面的数字,只需指示您的程序将那块内存(对您来说包含“a”)视为一个数字。使用演员表。这里:

http://www.cplusplus.com/doc/tutorial/typecasting/

看看有没有帮助!

于 2010-10-29T08:00:38.593 回答
2

想到的一种方法是使用类型特征来定义每种类型的输出类型。您必须手动为每种类型声明。可以将特征定义为模板结构,该模板结构专用于具有与数据类型本身不同的输出类型的每种数据类型:

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-29T07:53:04.957 回答
1

如果我没听错的话.. 像这样输出:

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将打印相同的内容:第一个 - 的 ASCII 代码'a': 97,第二个 - 只是97存储在 b 中的值。a和,两者b是完全一样的。

于 2010-10-29T07:52:44.343 回答
1

您可以简单地转换它:

#include<iostream>

int main()
{
 uint8_t blah = 65;
 std::cout << static_cast<int>(blah) << "\n";
 return 0;
}

65

于 2010-10-29T07:54:12.093 回答
0

您可以在输出它们之前强制转换它们:

std::cout << (unsigned int) container[index];
于 2010-10-29T07:58:46.010 回答