zoukankan      html  css  js  c++  java
  • 提防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做特殊处理。

  • 相关阅读:
    搞定 Linux Shell 文本处理工具,看完这篇还不够~
    ARM 版的Clang的使用
    GDB入门学习之gef插件的使用
    mac使用apktool
    python实现md5
    fridahookjava
    js hook array对象的push方法
    app逆向java转python代码
    python合并两个有序数组
    MySQL update 语句加锁分析
  • 原文地址:https://www.cnblogs.com/huqingyu/p/52551.html
Copyright © 2011-2022 走看看