• <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>
            隨筆-161  評論-223  文章-30  trackbacks-0
               本文以系統(tǒng)的struct timeval為例,使其支持+、-、+=、-=4種算術(shù)運算和<,<=,>,>=,==、!= 6種關(guān)系運算,這樣一來就免去了顯式調(diào)用函數(shù)的麻煩,使代碼簡潔優(yōu)雅,實現(xiàn)如下
             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類型,而算術(shù)運算的內(nèi)部實現(xiàn)保證了運算結(jié)果timeval對象是有效的,即其成員變量tv_usec取值在[0,1000000)區(qū)間,這是通過timeval_normalize函數(shù)實現(xiàn)的,代碼如下
             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式結(jié)構(gòu)上,大大簡化了代碼的編寫。以上所有代碼在vc2005和g++4.4下編譯通過。
            posted on 2013-10-28 23:37 春秋十二月 閱讀(1551) 評論(2)  編輯 收藏 引用 所屬分類: C/C++

            評論:
            # re: 巧用重載支持C式結(jié)構(gòu)的一些運算 2013-10-29 17:23 | 路過
            這是基本用法,談不上‘巧用’  回復  更多評論
              
            # re: 重載運算符之應用: 支持C式結(jié)構(gòu)的一些運算 2013-11-15 09:00 | zjx
            大哥 這個很好啊 學習  回復  更多評論
              
            久久精品国内一区二区三区| 久久成人国产精品| 久久国产影院| 日韩乱码人妻无码中文字幕久久 | 91久久精品无码一区二区毛片| 久久久久国产一级毛片高清板| 人妻无码αv中文字幕久久琪琪布| 久久亚洲AV成人出白浆无码国产| 久久se这里只有精品| 无码人妻久久一区二区三区 | 亚洲va中文字幕无码久久| 99久久综合国产精品二区| 亚洲国产精品无码久久久秋霞2 | 亚洲AV日韩AV永久无码久久| 国产精品VIDEOSSEX久久发布| 色诱久久久久综合网ywww| 亚洲精品乱码久久久久久蜜桃| 久久99国产精品久久久 | 久久综合久久综合九色| 亚洲香蕉网久久综合影视| 久久频这里精品99香蕉久| 久久久久无码专区亚洲av| 99久久精品国产一区二区三区| 亚洲av日韩精品久久久久久a| 亚洲а∨天堂久久精品| 久久996热精品xxxx| 国产高潮国产高潮久久久91 | 国产三级精品久久| 97精品国产97久久久久久免费| 国产午夜精品理论片久久影视| 婷婷久久久亚洲欧洲日产国码AV| 久久久午夜精品| 亚洲国产欧美国产综合久久| 国产99久久久国产精品小说| 国产精品久久久久久五月尺| 久久精品一本到99热免费| 久久久久久精品久久久久| 亚洲香蕉网久久综合影视| 久久久无码人妻精品无码| 国产成人久久激情91 | 伊人久久综合无码成人网|