• <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
            大哥 這個很好啊 學習  回復  更多評論
              
            久久综合给久久狠狠97色| 91精品国产综合久久香蕉| 亚洲精品无码久久久| 国产精品亚洲综合久久| 综合久久国产九一剧情麻豆| 综合网日日天干夜夜久久 | 久久精品中文无码资源站| av无码久久久久不卡免费网站 | 久久国产精品二国产精品| 久久精品国产2020| 国产成人精品综合久久久| 久久精品国产AV一区二区三区| 久久综合久久久| 一本色道久久99一综合| 国产三级观看久久| 欧美精品久久久久久久自慰| 久久嫩草影院免费看夜色| 久久91精品国产91久久户| 亚洲AV日韩精品久久久久| 久久国产精品波多野结衣AV| 久久91精品久久91综合| 亚洲欧美成人综合久久久| 亚洲国产成人久久综合一区77| 久久最新精品国产| 99国产欧美精品久久久蜜芽| 无码超乳爆乳中文字幕久久| 久久这里都是精品| 一本久道久久综合狠狠躁AV| 久久99精品久久久久久9蜜桃| 成人免费网站久久久| 国产V亚洲V天堂无码久久久| 久久精品国产亚洲AV香蕉| 久久人妻AV中文字幕| 色狠狠久久综合网| 亚洲乱码日产精品a级毛片久久| 久久不见久久见免费影院www日本| 26uuu久久五月天| 精品熟女少妇aⅴ免费久久| 久久精品成人免费国产片小草| 色综合久久综精品| 久久久精品久久久久特色影视|