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

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

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

Posted on 2008-11-06 23:30 Batiliu 閱讀(384) 評論(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精品国产在热久久婷婷| 亚洲精品1区2区| 亚洲欧美资源在线| 猫咪成人在线观看| 国产原创一区二区| 国产精品亚洲片夜色在线| 欧美精品一区二区视频| 久久久av水蜜桃| 久久国产一区| 91久久夜色精品国产网站| 久久国产加勒比精品无码| 亚洲欧美日韩精品综合在线观看| 一区二区三欧美| 这里只有精品丝袜| 尤物九九久久国产精品的特点 | 欧美四级在线观看| 国产精品三级视频| 在线看一区二区| 亚洲图片在线| 久久亚洲精品中文字幕冲田杏梨 | 亚洲一区二区三区精品在线| 欧美在线免费观看视频| 欧美国产精品中文字幕| 一级日韩一区在线观看| 久久久久久穴| 欧美日韩国产va另类| 国产一区观看| 国产精品99久久久久久久久| 久久精品国产亚洲一区二区三区| 欧美成年人视频| 亚洲影院在线观看| 欧美黑人在线观看| 韩日视频一区| 午夜精品亚洲| 日韩亚洲国产欧美| 久久久久国产精品一区二区| 欧美日一区二区三区在线观看国产免 | 欧美极品在线播放| 国产老女人精品毛片久久| 亚洲人成小说网站色在线| 欧美一区在线直播| 亚洲国产另类久久久精品极度 | 欧美乱人伦中文字幕在线| 国产在线精品一区二区夜色| 亚洲一区一卡| 亚洲精品一区二区网址| 鲁鲁狠狠狠7777一区二区| 国产亚洲毛片在线| 欧美一区二区三区四区在线观看| 亚洲欧洲日产国产网站| 久久躁狠狠躁夜夜爽| 国产精品久久久久av| 99一区二区| 亚洲精品一区二| 欧美激情国产日韩| 亚洲人成亚洲人成在线观看图片| 美女亚洲精品| 久久gogo国模裸体人体| 国产一区二区三区在线观看视频| 欧美一区三区二区在线观看| 在线综合亚洲| 国产精品久久久久久久久免费| 99在线视频精品| 亚洲精品久久久久| 欧美日韩一区二区在线| 亚洲综合精品自拍| 亚洲一区中文| 国语自产偷拍精品视频偷 | 国产午夜精品理论片a级探花 | 99精品视频免费在线观看| 亚洲国产精品久久久久久女王| 毛片av中文字幕一区二区| 亚洲国产另类久久久精品极度| 久久久国产精品一区| 久久激情五月婷婷| 亚洲丰满在线| 亚洲国产欧美国产综合一区| 欧美黑人多人双交| 亚洲图色在线| 午夜电影亚洲| 一区在线免费| 最近中文字幕日韩精品| 欧美区日韩区| 午夜精品一区二区三区在线视| 亚洲欧美一区二区三区极速播放 | 国内揄拍国内精品少妇国语| 你懂的国产精品| 欧美日韩国产丝袜另类| 欧美日韩综合| 国产美女精品视频免费观看| 久久久亚洲人| 欧美福利视频| 性欧美大战久久久久久久久| 久久国产加勒比精品无码| 91久久极品少妇xxxxⅹ软件| 99亚洲伊人久久精品影院红桃| 国产午夜精品福利| 亚洲日本va午夜在线电影| 国产日韩一区在线| 91久久精品美女高潮| 国产亚洲成av人片在线观看桃| 欧美国产日产韩国视频| 国产精品卡一卡二卡三| 欧美大片91| 国产日韩欧美精品综合| 亚洲国产精品久久人人爱蜜臀| 国产精品无码专区在线观看 | 中文欧美日韩| 亚洲国产黄色| 亚洲欧美日韩区| 日韩亚洲精品视频| 久久精品视频在线| 亚洲男人第一av网站| 免费看亚洲片| 久久蜜桃资源一区二区老牛| 亚洲欧美中文在线视频| 久久久久久**毛片大全| 欧美激情视频一区二区三区不卡| 午夜免费久久久久| 久久精品系列| 久久综合一区二区| 亚洲免费精品| 亚洲国产中文字幕在线观看| 欧美亚洲视频一区二区| 亚洲一级二级在线| 亚洲综合日韩在线| 午夜精品美女久久久久av福利| 99这里有精品| 欧美一区二区视频97| 久久精品亚洲热| 女女同性精品视频| 亚洲欧洲三级| 亚洲一区日韩在线| 老**午夜毛片一区二区三区| 欧美国产精品va在线观看| 欧美激情国产高清| 国内精品美女av在线播放| 亚洲欧美日韩国产精品| 亚洲欧美一级二级三级| 老司机成人在线视频| 欧美午夜精品久久久久久浪潮| 国产精品永久免费| 日韩系列在线| 麻豆亚洲精品| 午夜精品久久久99热福利| 国产亚洲第一区| 欧美激情综合亚洲一二区 | 在线看片日韩| 欧美黄色大片网站| 欧美日韩在线观看视频| 性亚洲最疯狂xxxx高清| 久久―日本道色综合久久| 日韩亚洲综合在线| 久久精品五月婷婷| 亚洲免费视频观看| 久久综合九色综合欧美狠狠| 日韩西西人体444www| 欧美在线观看一区| 亚洲一区二区欧美日韩| 牛牛精品成人免费视频| 欧美一区二区三区的| 欧美另类一区二区三区| 欧美伊人久久大香线蕉综合69| 免费不卡欧美自拍视频| 小辣椒精品导航| 欧美日韩免费精品| 亚洲成色999久久网站| 国产精品中文字幕欧美| 亚洲精品欧美极品| 亚洲欧洲精品成人久久奇米网 | 欧美chengren| 欧美成人国产va精品日本一级| 国产欧美日韩一区二区三区| 亚洲国产精品一区二区尤物区| 国产一区二区中文| 亚洲欧美一区二区激情| 午夜精品久久久久久久男人的天堂| 欧美福利一区二区| 久久高清一区| 欧美日韩国产色综合一二三四 | 亚洲激情小视频| 亚洲一区欧美| 99一区二区| 欧美激情综合五月色丁香| 欧美成人xxx| 亚洲精品一线二线三线无人区| 蜜臀久久久99精品久久久久久 | 欧美一区二区三区婷婷月色| 欧美国产日本| 亚洲区国产区| 欧美一级淫片播放口| 国产一区二区中文| 免费av成人在线| 亚洲免费网站| 欧美国产日韩一区二区| 99国产精品久久| 欧美日韩999| 午夜精品一区二区三区在线| 久久人人97超碰人人澡爱香蕉| 伊伊综合在线|