• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-159  評論-223  文章-30  trackbacks-0
               本文以系統的struct timeval為例,使其支持+、-、+=、-=4種算術運算和<,<=,>,>=,==、!= 6種關系運算,這樣一來就免去了顯式調用函數的麻煩,使代碼簡潔優雅,實現如下
             1extern void timeval_normalize(timeval &t);
             2
             3class timeval_t : public ::timeval
             4{
             5public:
             6    timeval_t(long sec = 0,long usec = 0)
             7    {
             8        tv_sec = sec, tv_usec = usec;
             9        timeval_normalize(*this);
            10    }

            11    
            12    timeval_t(const timeval& t)
            13    {
            14        if (this != &t){
            15            tv_sec = t.tv_sec, tv_usec = t.tv_usec;
            16            timeval_normalize(*this);
            17        }

            18    }

            19    
            20    timeval_t& operator = (const timeval &t)
            21    {
            22        if (this != &t){
            23            tv_sec = t.tv_sec, tv_usec = t.tv_usec;
            24            timeval_normalize(*this);
            25        }

            26        return *this;
            27    }

            28}
            ;
            29
            30inline void operator += (timeval &t1,const timeval &t2)
            31{
            32    t1.tv_sec += t2.tv_sec,t1.tv_usec += t2.tv_usec;
            33    timeval_normalize(t1);
            34}

            35
            36inline void operator -= (timeval &t1,const timeval &t2)
            37{
            38    t1.tv_sec -= t2.tv_sec, t1.tv_usec -= t2.tv_usec;
            39    timeval_normalize(t1);
            40}
                
            41
            42inline timeval operator + (const timeval &t1,const timeval &t2)
            43{
            44    return timeval_t(t1.tv_sec+t2.tv_sec,t1.tv_usec+t2.tv_usec);
            45}

            46
            47inline timeval operator - (const timeval &t1,const timeval &t2)
            48{
            49    return timeval_t(t1.tv_sec-t2.tv_sec,t1.tv_usec-t2.tv_usec);
            50}

            51
            52inline bool operator == (const timeval &t1,const timeval &t2)
            53
            54    timeval_t t(t1.tv_sec-t2.tv_sec,t1.tv_usec-t2.tv_usec);
            55    return 0==t.tv_sec&&0==t.tv_usec;
            56}

            57
            58inline bool operator != (const timeval &t1,const timeval &t2)
            59{
            60    return !(t1 == t2);
            61}

            62
            63inline bool operator < (const timeval &t1,const timeval &t2)
            64{
            65    timeval t = t1 - t2;
            66    return t.tv_sec < 0;
            67}

            68
            69inline bool operator > (const timeval &t1,const timeval &t2)
            70{
            71    timeval t = t1 - t2;
            72    return 0==t.tv_sec && t.tv_usec>0 || t.tv_sec>0;
            73}

            74
            75inline bool operator <= (const timeval &t1,const timeval &t2)
            76{
            77    return !(t1 > t2);
            78}

            79
            80inline bool operator >= (const timeval &t1,const timeval &t2)
            81{
            82    return !(t1 < t2);
            83}
               由于timeval_t公有繼承timeval,因此上述10種運算也支持timeval_t類型,而算術運算的內部實現保證了運算結果timeval對象是有效的,即其成員變量tv_usec取值在[0,1000000)區間,這是通過timeval_normalize函數實現的,代碼如下
             1static const long ONE_SECOND_IN_USECS = 1000000;
             2
             3void timeval_normalize(timeval &t)
             4{
             5    if (t.tv_usec >= ONE_SECOND_IN_USECS){
             6        do {
             7            ++t.tv_sec;
             8            t.tv_usec -= ONE_SECOND_IN_USECS;
             9        }
            while (t.tv_usec >= ONE_SECOND_IN_USECS);
            10    }
            else if (t.tv_usec <= -ONE_SECOND_IN_USECS) {
            11        do     {
            12            --t.tv_sec;
            13            t.tv_usec += ONE_SECOND_IN_USECS;
            14        }
            while (t.tv_usec <= -ONE_SECOND_IN_USECS);
            15    }

            16
            17    if (t.tv_sec >= 1 && t.tv_usec < 0)    {
            18        --t.tv_sec;
            19        t.tv_usec += ONE_SECOND_IN_USECS;
            20    }

            21}

               最后來看下使用示例  
             1    timeval t1,t2,t3;
             2    timeval_t tv1,tv2,tv3;
             3    bool b;
             4
             5    b = t1 == t2;
             6    b = t1 != t2;
             7    b = t1 == tv2;
             8    b = t1 != tv2;
             9    b = tv1 == t2;
            10    b = tv1 != t2;
            11    b = tv1 == tv2;
            12    b = tv1 != tv2;
            13
            14    b = t1 < t2;
            15    b = t1 <= t2;
            16    b = t1 > t2;
            17    b = t1 >= t2;
            18    b = t1 < tv2;
            19    b = t1 <= tv2;
            20    b = t1 > tv2;
            21    b = t1 >= tv2;
            22
            23    b = tv1 < t2;
            24    b = tv1 <= t2;
            25    b = tv1 > t2;
            26    b = tv1 >= t2;
            27    b = tv1 < tv2;
            28    b = tv1 <= tv2;
            29    b = tv1 > tv2;
            30    b = tv1 >= tv2;
            31
            32    t3  = t1 + t2;
            33    t3  = tv1 + tv2;
            34    t3  = t1 + tv2;
            35    t3  = tv1 + t2;
            36    tv3  = t1 + t2;
            37    tv3  = tv1 + tv2;
            38    tv3  = t1 + tv2;
            39    tv3  = tv1 + t2;
            40
            41    t3  = t1 - t2;
            42    t3  = tv1 - tv2;
            43    t3  = t1 - tv2;
            44    t3  = tv1 - t2;
            45    tv3  = t1 - t2;
            46    tv3  = tv1 - tv2;
            47    tv3  = t1 - tv2;
            48    tv3  = tv1 - t2;
            49
            50    t1  += t2;
            51    t1  += tv2;
            52    tv1 += t2;    
            53    tv1 += tv2;
            54    t1  -= t2;
            55    t1  -= tv2;
            56    tv1 -= t2;
            57    tv1 -= tv2;
              可以看到將運算符用到C式結構上,大大簡化了代碼的編寫。以上所有代碼在vc2005和g++4.4下編譯通過。
            posted on 2013-10-28 23:37 春秋十二月 閱讀(1544) 評論(2)  編輯 收藏 引用 所屬分類: C/C++

            評論:
            # re: 巧用重載支持C式結構的一些運算 2013-10-29 17:23 | 路過
            這是基本用法,談不上‘巧用’  回復  更多評論
              
            # re: 重載運算符之應用: 支持C式結構的一些運算 2013-11-15 09:00 | zjx
            大哥 這個很好啊 學習  回復  更多評論
              
            精品久久久无码人妻中文字幕| 久久久噜噜噜久久中文福利| 久久99国产综合精品| 久久97精品久久久久久久不卡| 亚洲国产成人精品91久久久| 亚洲国产香蕉人人爽成AV片久久 | 69SEX久久精品国产麻豆| 久久亚洲国产精品五月天婷| 国产精品美女久久久久| 日韩精品无码久久一区二区三| 久久本道久久综合伊人| 久久久久久噜噜精品免费直播| 99久久香蕉国产线看观香| 久久综合九色综合精品| 久久99精品久久久久久hb无码 | 国产精品一久久香蕉国产线看观看 | 久久久久久久久久久久中文字幕 | 亚洲精品高清久久| 中文字幕乱码久久午夜| 国产精品一久久香蕉产线看| 久久国产免费观看精品| 久久综合九色欧美综合狠狠| 亚洲av日韩精品久久久久久a| 精品久久久久久综合日本| 久久影院综合精品| 精品久久久久久久久免费影院| 日韩美女18网站久久精品| 亚洲婷婷国产精品电影人久久| 久久久久国产视频电影| 色综合久久无码中文字幕| 亚洲婷婷国产精品电影人久久| 无码人妻久久久一区二区三区| 久久国产亚洲精品麻豆| 久久综合亚洲色HEZYO社区| 久久人人爽人人爽人人AV | 新狼窝色AV性久久久久久| 无码人妻精品一区二区三区久久久 | 青青草原精品99久久精品66 | 久久精品国产99久久久香蕉| 久久久精品国产亚洲成人满18免费网站| 香港aa三级久久三级老师2021国产三级精品三级在|