提防iostream使用中的一个“陷阱”
先看下面的示例代码:
template < typename T > void test()
{
T o;
for(T i = numeric_limits< T >::min(); i < numeric_limits< T >::max(); ++i)
{
stringstream stream;
stream << i;
stream >> o;
assert(i == o);
}
}
试着按下面这样调用它:
test< int >();
一点问题都没有。
再这样调用:
test< char > ();
你会发现当i=9的时候,assert在大声地“抱怨”,这种情况下,我们受了stream“放进去什么,拿出来也是什么”的假相的迷惑,往stream放进去一个(char)9,是拿不出来任何东西的!
或许你说,“好的,我知道了,stream对字符的处理和数值的处理不一样”,我们再来看一个例子:
test< BYTE >
这种情况下,我们一样的被BYTE迷惑了,BYTE是我们一厢情愿定义的“数值”类型,实际上,只是一个unsigned char而已,会被iostream当作char一样处理。
注:上面的例子只在VC 7.1下、用MS版的STL测试过,别的版本的STL会如何处理char和BYTE,我自己没有测试过,不敢下结论。
另外,我注意到boost::lexical_cast(V 1.31.0)也没有对char和BYTE做特殊处理。
查看更多关于提防iostream使用中的一个“陷阱”的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did45181