我可以帮忙翻译。下面是需要翻译的内容:
我无法不回答问题的第一部分(谁做了那件事?)。但这个问题已经在其他帖子中得到了回答。
至于问题的第二部分(设计良好吗?),我的回答是坚决的“不是!”这里有一个小例子,让我不敢相信多年:
#include <stdint.h>
#include <iostream>
#include <vector>
template <class _T>
void ShowVector( const char *title, const std::vector<_T> &v)
{
std::vector<_T>::const_iterator iter;
std::cout << title << " (" << v.size() << " elements): ";
for( iter = v.begin(); iter != v.end(); ++iter )
{
std::cout << (*iter) << " ";
}
std::cout << std::endl;
}
int main( int argc, const char * argv[] )
{
std::vector<uint8_t> byteVector;
std::vector<uint16_t> wordVector;
byteVector.push_back( 42 );
wordVector.push_back( 42 );
ShowVector( "Garbled bytes as characters output o.O", byteVector );
ShowVector( "With words, the numbers show as numbers.", wordVector );
return 0;
}
上述代码由于iostream设计的原因而产生了无意义的结果。出于我难以理解的某些原因,它们将uint8_t字节视为字符,而较大的整数类型则被视为数字。Q.e.d.糟糕的设计。
我也想不到任何方法来解决这个问题。该类型也可以是浮点数或双精度浮点数,因此将其转换为“int”以使愚蠢的iostream理解数字而不是字符并不会有所帮助。
IOStream设计存在缺陷,因为它没有为程序员提供表达如何处理项目的手段。 IOStream实现做出了任意决定(例如将uint8_t视为char而不是字节数)。这是IOStream设计的缺陷,因为它们试图实现不可能的目标。
C ++不允许对类型进行分类 - 该语言没有这样的功能。没有is_number_type()或is_character_type()这样的东西可以用于IOStream以进行合理的自动选择。忽略这一点并试图猜测是库的设计缺陷。
承认,printf()在通用的“ShowVector()”实现中同样无法正常工作。但这并不是iostream行为的借口。但很可能在printf()情况下,ShowVector()将定义如下:
template <class _T>
void ShowVector( const char *formatString, const char *title, const std::vector<_T> &v );
std::streambuf
是读写字节的基类,而istream
/ostream
则是用于格式化输入和输出的类,将一个指向std::streambuf
的指针作为它们的目标/来源。 - Johannes Schaub - litbostream foo(&somebuffer); foo << "huh"; foo.rdbuf(cout.rdbuf()); foo << "see me!";
- Johannes Schaub - litbstd::streambuf
支持文本I/O。 - curiousguy