青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 13, comments - 4, trackbacks - 0, articles - 0
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

Exceptional C++ Style 讀書筆記(三)

Posted on 2008-11-06 23:30 Batiliu 閱讀(379) 評論(0)  編輯 收藏 引用 所屬分類: 讀書筆記

第三十二條 奇形怪狀

下面程序的輸出是什么?

#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    int x = 1;
 
    // 下面這行代碼你確認在遞增嗎??/
    ++x;
 
    std::cout << x << std::endl;
 
    return 0;
}

“輸出 2”,如果你無須思索的回答道。那么,恭喜你。。。。答錯了。不相信?請你將這段程序一字不差的復制到Visual Studio中(本人環境VS2008),然后Ctrl+F5,正確答案會立即顯示在眼前:輸出居然是 1!

 

最好在你親自試驗了后,我們來一起揭曉原因:

注意到“// 下面這行代碼你確認是遞增嗎??/”這行注釋了嗎?注釋中結尾的“??/”會被轉換成“\”,而后者放在一行的末尾作用相當于將接下來的一行“粘貼”到這一行的末尾!這太令人詫異了!本例中,它將接下來的“++x”粘貼到了注釋行的末尾,這樣“++x”就成了注釋的一部分,不會被實際實行了。

為什么會這樣?因為C++從C語言繼承了一個“三字符組”的特性。所謂三字符組(trigraph)是指三個字符組成的轉義符,比如“??/”=“\”,“??!”=“~”等。

 

風格案例研究

 

以下代碼展示了在已有容器中創建索引表的一種慣用法。

// 代碼展示:索引表
#include <vector>
#include <map>
#include <algorithm>
 
// Solution1
 
namespace Solution1 {
    template<class Iter>
    class sort_idxtbl_pair {
    public:
        void set(const Iter& it, int i) { it_ = it; i_ = i; }
        bool operator<(const sort_idxtbl_pair& other) const
        { return *it_ < *other.it_; }
        operator int() const { return i_; }
    private:
        Iter it_;
        int i_;
    };
 
    template<class IterIn, class IterOut>
    void sort_idxtbl(IterIn first, IterIn last, IterOut out) {
        std::vector<sort_idxtbl_pair<IterIn> > v(last - first);
        
        for (int i = 0; i < last - first; ++i)
            v[i].set(first + i, i);
 
        std::sort(v.begin(), v.end());
 
        std::copy(v.begin(), v.end(), out);
    }
}
 
// Solution2:使用std::pair而不是重新發明一個類似pair的輔助類。
namespace Solution2 {
    template<class T, class U>
    struct ComparePair1stDeref {
        bool operator()(const std::pair<T,U>& a, const std::pair<T,U>& b) const
        { return *a.first < *b.first; }
    };
 
    template<class IterIn, class IterOut>
    void sort_idxtbl(IterIn first, IterIn last, IterOut out) {
        std::vector<std::pair<IterIn, int> > s(last - first);
        for (int i = 0; i < s.size(); ++i)
            s[i] = std::make_pair(first + i, i);
 
        std::sort(s.begin(), s.end(), ComparePair1stDeref<IterIn,int>());
 
        for (int i = 0; i < s.size(); ++i, ++out)
            *out = s[i].second;
    }
}

測試用例:

#include <iostream>
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a[10] = {8, 9, 1, 3, 5, 7, 6, 4, 2, 0};
    std::vector<int> idxtbl(10);
 
    Solution2::sort_idxtbl(a, a + 10, idxtbl.begin());
 
    for (int i = 0; i < 10; ++i)
        std::cout << "i = " << i 
                << ", idxtbl[i] = " << idxtbl[i]
                << ", a[idxtbl[i]] = " << a[idxtbl[i]]
                << std::endl;
 
    return 0;
}

以下代碼展示了一個用于外覆回調函數的慣用手法。

class CallbackBase {
public:
    virtual void operator()() const {};
    virtual ~CallbackBase() = 0;
};
 
CallbackBase::~CallbackBase() {}
 
template<typename T>
class Callback : public CallbackBase {
public:
    typedef void (T::*F)();
 
    Callback(T& t, F t) : t_(&t), f_(f) {}
    void operator()() const { (t_->*f_)(); }
 
private:
    T* t_;
    F  f_;
};
 
template<typename T>
Callback<T> make_callback(T& t, void(T::*f)()) {
    return Callback<t>(t, f);
}
 
你需要支持const成員函數?支持非void類型的返回值?支持不同參數類型或數目的回調函數?別急、別急,敬請期待我即將發布的《基于C++的多播委托》,如果你實在等不及,Loki庫的'functors'將為你帶來頂級大師的盛宴。
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美成人午夜激情视频| 久久久99久久精品女同性| 欧美国产极速在线| 91久久久一线二线三线品牌| 亚洲国产日韩美| 每日更新成人在线视频| 亚洲日本电影在线| 99re热这里只有精品视频| 欧美三区在线视频| 久久国产88| 快射av在线播放一区| 亚洲美女在线国产| 亚洲深夜激情| 亚洲成人影音| 99re66热这里只有精品3直播| 国产精品―色哟哟| 免费成人高清视频| 欧美视频网址| 老色鬼精品视频在线观看播放| 欧美大片免费观看| 欧美在线免费看| 欧美波霸影院| 久久av一区二区三区亚洲| 免费中文日韩| 午夜精品久久久久久久99水蜜桃 | 欧美 日韩 国产 一区| 久久日韩精品| 亚洲欧美日韩高清| 久久香蕉国产线看观看av| 亚洲无限乱码一二三四麻| 久久精品99国产精品日本| 一本久道久久久| 久久精品一本| 午夜精品久久久久久久99樱桃| 另类欧美日韩国产在线| 午夜免费在线观看精品视频| 欧美成人国产一区二区| 欧美在线播放高清精品| 欧美日韩第一区| 欧美mv日韩mv国产网站| 国产精品你懂的| 亚洲欧洲在线看| 国内视频精品| 亚洲欧美影音先锋| 一区二区三区免费在线观看| 久久阴道视频| 久久精品一区二区国产| 国产精品久久久久久久一区探花| 欧美国产日韩一区| 韩日成人av| 欧美亚洲日本一区| 亚洲专区在线| 欧美日韩国产小视频在线观看| 卡一卡二国产精品| 国产人成一区二区三区影院| 亚洲婷婷综合久久一本伊一区| 99re66热这里只有精品3直播| 另类激情亚洲| 欧美福利电影在线观看| 在线观看欧美一区| 久久久久久久久一区二区| 久久久久久久一区二区三区| 国产欧美一区二区精品性色| 亚洲欧美国产va在线影院| 亚洲免费在线| 国产精品无码专区在线观看| 亚洲香蕉伊综合在人在线视看| 亚洲影院高清在线| 国产精品久久久久免费a∨大胸| 日韩视频免费观看高清完整版| 日韩午夜av在线| 欧美视频在线视频| 一本久道久久综合狠狠爱| 一区二区三区国产精品| 欧美色综合天天久久综合精品| 一区二区日韩欧美| 亚洲欧美在线另类| 国产一区二区三区免费不卡| 久久精品中文字幕一区二区三区| 免费在线观看成人av| 亚洲日本va午夜在线电影| 欧美精品 日韩| 正在播放欧美视频| 久久九九久久九九| 亚洲激情电影在线| 欧美日韩久久久久久| 亚洲视频在线观看网站| 久久久久久国产精品mv| 亚洲电影欧美电影有声小说| 欧美精品videossex性护士| 中文精品在线| 久久女同互慰一区二区三区| 亚洲精品视频免费观看| 国产精品扒开腿爽爽爽视频| 欧美一区1区三区3区公司| 欧美激情亚洲精品| 亚洲视频精选在线| 国产一区白浆| 欧美精品在线观看91| 午夜天堂精品久久久久| 欧美激情精品久久久久久大尺度| 亚洲性夜色噜噜噜7777| 国内精品国语自产拍在线观看| 欧美激情偷拍| 久久er精品视频| 99成人在线| 欧美成人在线影院| 午夜亚洲视频| 亚洲伦理在线免费看| 国产一区清纯| 国产精品国产自产拍高清av王其| 久久久免费av| 亚洲欧美日韩一区二区三区在线观看 | 欧美激情国产高清| 欧美在线视频全部完| 亚洲精品视频免费观看| 久久亚洲精品一区二区| 亚洲视频香蕉人妖| 亚洲国产三级在线| 国产一区二区精品久久99| 欧美精品v日韩精品v韩国精品v | 久久久国际精品| 亚洲香蕉伊综合在人在线视看| 欧美福利网址| 久久在线视频| 欧美一进一出视频| 亚洲一级免费视频| 亚洲伦理一区| 亚洲精品在线二区| 亚洲国产三级在线| 有坂深雪在线一区| 国产一区二区三区久久| 国产日韩欧美一二三区| 国产精品永久免费| 欧美三级不卡| 国产精品第一区| 国产精品jizz在线观看美国| 欧美欧美在线| 欧美精品18| 欧美日韩国产大片| 欧美日韩和欧美的一区二区| 欧美激情导航| 欧美精品一区二区三区很污很色的| 开心色5月久久精品| 久久欧美肥婆一二区| 久久久999精品视频| 久久久久成人精品| 老司机67194精品线观看| 裸体女人亚洲精品一区| 奶水喷射视频一区| 欧美大片免费| 欧美色道久久88综合亚洲精品| 欧美亚洲第一区| 国产欧美日韩免费| 国产视频久久久久| 激情丁香综合| 亚洲精品国偷自产在线99热| 一本色道久久综合| 亚洲男人的天堂在线| 欧美影院视频| 欧美+亚洲+精品+三区| 亚洲国产另类久久精品| 99国产精品国产精品毛片| 亚洲特级片在线| 欧美在线91| 欧美成人激情在线| 国产精品国产三级国产普通话三级 | 久久中文欧美| 亚洲国产日韩一区| 在线亚洲欧美| 久久www成人_看片免费不卡| 农夫在线精品视频免费观看| 欧美日韩一区精品| 韩国三级电影一区二区| 日韩图片一区| 久久久国产一区二区| 亚洲激情在线| 午夜精品一区二区在线观看| 麻豆精品视频在线观看| 国产精品高清网站| 激情五月***国产精品| 一本到高清视频免费精品| 欧美在线一级视频| 亚洲精品日日夜夜| 欧美资源在线| 欧美午夜电影一区| 一区二区在线看| 亚洲欧美综合精品久久成人 | 一区二区三区精密机械公司| 久久久夜夜夜| 中文日韩电影网站| 欧美成人伊人久久综合网| 国产精品自在线| 日韩视频免费观看| 久热国产精品| 亚洲欧美另类在线观看| 欧美日韩成人综合在线一区二区| 在线欧美日韩精品| 久久精品三级| 亚洲影音先锋|