背景:

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

问题:

默认的是,这些类型如下char(ASCII)输出。 我只用ASCII变量,总是有符号/符号类型char(或wchar_t或其他)。 我如何获得这些其他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)

有帮助吗?

解决方案

,想到利用型性状来定义每个类型的输出类型的一种方法。你将不得不声明,对每种类型的手。性状可以被定义为提供专门用于每一个数据类型,它具有不同的输出型比的模板结构数据类型本身:

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

其他提示

你混淆的变量中的实际数据,与您选择在打印任何表示。

考虑一下这种方式:charsintsdoubleslongs,凡是,他们的记忆都只是块,为您储存号码一个字符是0和255(或-128和127)之间的数字。 - 你可以选择将其表示为ASCII字符,或为数字,或如用OpenGL的帮助下天空分

如果你想看到的字符后面的数字“一”,只是指示您的程序处理的内存块(为你包含了一个“A”)为数字。使用强制类型转换。这里:

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

看看是否有帮助!

您可以简单地将它转换:

#include<iostream>

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

65

如果我明白你的权利..输出这样的:

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'的ASCII码:97,第二个 - 只是值97,存储在B。既,ab,是绝对相同的。

您可以之前,你输出它们丢掉。

std::cout << (unsigned int) container[index];
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top