• <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久久久久久猫咪| 日本三级久久网| 青青热久久国产久精品 | 午夜天堂精品久久久久| 性做久久久久久久久| 伊人热热久久原色播放www| 欧美激情一区二区久久久| 久久综合给合久久国产免费| 久久免费精品一区二区| 国产精品嫩草影院久久| 99精品国产免费久久久久久下载| 久久久噜噜噜www成人网| 狠狠综合久久综合中文88| 一本一本久久a久久综合精品蜜桃 一本一道久久综合狠狠老 | 女人香蕉久久**毛片精品| 亚洲国产婷婷香蕉久久久久久| 久久久久亚洲AV成人片 | 亚洲AV无码久久精品狠狠爱浪潮| 久久精品国产亚洲av高清漫画| 狠狠色丁香婷婷综合久久来来去 | 人妻无码αv中文字幕久久| 久久亚洲国产精品一区二区| 亚洲国产精品无码久久久久久曰| 久久久久久免费一区二区三区| 思思久久精品在热线热| 狠狠人妻久久久久久综合蜜桃| 国产午夜久久影院| 丁香色欲久久久久久综合网| 久久精品免费网站网| 99精品久久精品一区二区| 国产69精品久久久久APP下载| 国产91久久综合| 久久国产乱子伦精品免费强| 久久久久高潮毛片免费全部播放| 精品伊人久久久| 色青青草原桃花久久综合| 久久er国产精品免费观看8| 精品国产综合区久久久久久| 国产精品99久久久久久www| 国产成人99久久亚洲综合精品 | 久久久久久久久久久|