2010-10-29 45 views
2

背景:如何输出无符号/符号的字符或<cstdint>类型与整数<<在C++

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

问题:

默认的是,这些类型如下char(ASCII)输出 我只用char(或。或其他)的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)

+0

你可以添加一些代码示例吗? – 2010-10-29 07:52:16

+0

请您为我们发布一些代码以便更好地理解? – 2010-10-29 07:53:04

+0

你很混乱...... gah对于评论太长了。编辑:看到我的回答如下 – slezica 2010-10-29 08:00:55

回答

2

想到的一种方法是使用类型特征来定义每种类型的输出类型。您必须手动为每种类型声明。该特性可以被定义为专门针对每个数据类型具有不同的输出类型比数据类型本身就是一个模板结构:

template<T> 
struct output_trait { 
    typedef const T & output_type; 
} 

在您的运营商你写:

​​

这将做在默认情况下不投,但对于其output_trait专业类型它会做一个转换:

template<> 
struct output_trait< unsigned char > { 
    typedef unsigned int output_type; 
} 
+0

@sbi:的确如此。固定。 – 2010-10-29 08:20:23

+0

谢谢,我永远不会猜到我自己。 (其他答案完全错过了关于模板容器的部分。) – StellarVortex 2010-10-31 06:17:01

+0

(应该是'static_cast :: output_type>(变量)') – StellarVortex 2010-11-01 10:14:23

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中。两者,ab,都是一样的。

+0

+1我也了解。不知道xD – slezica 2010-10-29 07:56:35

+0

10x,无论如何xD这将是非常好的,如果海报解释自己的例子(: – 2010-10-29 07:58:22

+0

当你有这样的问题时,这并不容易,它发生在我们所有人:如果我们真的能够用准确性我们的问题,我们已经找到了解决办法,我最终回答,看看我是否可以进一步解释xD – slezica 2010-10-29 08:03:50

1

你可以简单地将它转换:

#include<iostream> 

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

这在模板运算符中是不可能的,因为它会要求我事先知道类型。 – StellarVortex 2010-11-01 07:25:01

0

您可以将输出之前,他们投他们:

std::cout << (unsigned int) container[index]; 
+0

容器并不意味着“字符串”或数组,或者某物。它意味着一个包含其他对象/变量的对象。所以,如果你的内部有一个带有两个字符的结构体,你不能像这样输出它们(:。无论如何,我没有投下你的答案,因为我理解你的意思,但不要混合这些术语,请提供(: – 2010-10-29 08:04:05

+1

谢谢澄清,我只是想给出一个最简单的抽象的例子,当我开始写我的答案时,其他的(更好的)答案不在那里 – bjoernz 2010-10-29 08:17:59

3

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

认为它是这样的:charsintsdoubleslongs,凡是,他们都只是内存块以供您存储的数字在一个char是0和255(或-128和127之间的数字。 ) - 您可以选择将其表示为ASCII字符,或数字,或借助OpenGL将其表示为天空中的星星。

如果你想看到字符'a'后面的数字,只需指示你的程序将该块内存(对于你来说包含'a')作为一个数字。使用强制转换。在这里:

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

看看是否有帮助!

+0

'+ 1'用于解决OP的潜在混淆问题,而不是显示使用哪种语法 – sbi 2010-10-29 08:17:00

+0

这在模板运算符中是不可能的,因为它会要求我事先知道类型。 – StellarVortex 2010-11-01 07:24:41