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

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

STL中的Concept和Boost庫的Concept_Check

在generic programming當中,一個重要的概念就是concept(滑稽的是,如果把這個concept也翻譯成“概念”,那就狗屁不通了。我傾向于說它是“操作集”)。concept就是一組操作,如果一個type具有這些操作,那么就說這個type是這個concept的一個model。
這其中的思想有那么一丁點像是oo當中的interface,一個class如果實現了一個interface,那么它就可以被當作這個interface來用。同樣,如果一個type是一個concept的model,那么所有接受這個concept的操作也就可以接受這個type。
例如,在stl中,stable_sort這個算法必須接受randomaccessiterator,這里randomaccessiterator就是一個concept,它規定自己的model必須可以進行下標運算,那么不滿足這個concept的type就無法被編譯器接受(搞笑的是我在vc71里面把list<int> 的iterator傳給stable_sort,它居然欣然接受,要知道list的iterator應該只是一個bidirectionaliterator 啊,比randomaccessiterator弱多了。不過仔細看看代碼,發現vc71的stable_sort接受bidirectionaliterator就夠了,不知道是好還是壞)。在gcc下面如果傳遞一個bidirectionaliterator給stable_sort,會得到一堆不知所云的錯誤提示,讓人摸不著頭腦。
c++語言本身并沒有對于concept的直接支持,stl解決這個問題的辦法是用了一些traits來限制iterator的特性,以達到在編譯時期檢查concept的目的。但是traits導致的編譯錯誤提示實在是太可怕了,我非常懷疑有哪個正常人可以從這些錯誤提示推測出自己錯在哪里。
在boost庫里面,提供了一個conceptcheck庫,它可以幫助我們寫出帶有concept檢查的代碼,而且沒有運行時的開銷,一旦用戶違反concept限制,輸出的錯誤提示也比較好懂。舉個例子先,如果stl里面有conceptcheck,那么它的stable_sort大約會這樣:
#include <boost/concept_check.hpp>
template <class randomaccessiter>
void stable_sort(randomaccessiter first, randomaccessiter last)
{
    function_requires< randomaccessiteratorconcept<randomaccessiter> >();
    //... bla bla bla......
}
有了這個 function_requires ,如果再傳遞給它list的iterator,編譯器(vc71)就會報這樣的錯:


c:\boost_1_31_0\boost\concept_check.hpp(642): error c2676: 二進制“+=” : “std::list<_ty>::iterator”不定義該運算符或到預定義運算符可接收的類型的轉換
        with
        [
            _ty=int
        ]
當然還有很多別的,但是至少它說了一點:傳入的iterator不滿足某個運算。這對于用戶來說,應當是一個很有用的提示。
使用concept check還有一個額外的好處,那就是調用一個 function_requires可遠比寫一些traits容易,而且代碼也清晰好維護。

這個好用的 function_requires 就定義在concept_check.hpp當中:
template <class concept>
inline void function_requires(mpl::identity<concept>* = 0)
{
#if !defined(ndebug)
  void (concept::*x)() = boost_fptr concept::constraints;
  ignore_unused_variable_warning(x);
#endif
}
換句話說,function_requires只在debug中起作用,那么是不是在debug當中它就添加了overhead呢?其實也沒有,仔細看看代碼:
void (concept::*x)() = boost_fptr concept::constraints;
這一句取constraints的地址。妙就妙在它讓編譯器“注意到”constraints,但又沒有真正調用constraints,而constraints是一個虛函數,做實際的check。例如在randomaccessiteratorconcept(檢查iterator是否符合randomaccessiterator的concept)當中,constraint是這個樣子:
template <class tt>
struct randomaccessiteratorconcept
{
    void constraints() {
    function_requires< bidirectionaliteratorconcept<tt> >();
    function_requires< comparableconcept<tt> >();
#ifndef boost_no_std_iterator_traits
    typedef typename std::iterator_traits<tt>::iterator_category c;
    function_requires< convertibleconcept< c,
        std::random_access_iterator_tag> >();
    typedef typename std::iterator_traits<tt>::reference r;
#endif

    i += n;             // require assignment addition operator
    i = i + n; i = n + i; // require addition with difference type
    i -= n;             // require assignment subtraction operator
    i = i - n;                  // require subtraction with difference type
    n = i - j;                  // require difference operator
    (void)i[n];                 // require element access operator
    }
    tt a, b;
    tt i, j;
#ifndef boost_no_std_iterator_traits
    typename std::iterator_traits<tt>::difference_type n;
#else
    std::ptrdiff_t n;
#endif
};
從這個實現中我們完全可以讀出randomaccessiterator的具體含義:
1. 它必須是一個bidirectionaliterator
2. 它必須滿足“可比較 (comparable)”的concept
3. 它還必須滿足“可轉換 (convertible)”的concept,而且是轉換成自己的iterator_category類別

4. 它必須定義了reference這個type
5. 這是最重要的,它必須有difference_type,而且可以進行 +, -, +=, -= 的運算
還要記得,由于這個函數沒有真正的被調用過,所以無論你怎么寫,它都不會變成實際的代碼,所以也不會影響運行效率的!

posted on 2008-07-26 23:08 肥仔 閱讀(1121) 評論(0)  編輯 收藏 引用 所屬分類: C++ 基礎

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美高清视频www夜色资源网| 亚洲欧美日韩精品久久久| 国产精自产拍久久久久久蜜| 欧美日本免费| 欧美精品一区二区三区在线播放 | 欧美a级在线| 欧美成人69av| 欧美日韩专区| 亚洲欧美日韩国产一区| 亚洲二区在线| 国产午夜精品麻豆| 国产亚洲欧洲997久久综合| 国产一区二区在线观看免费| 久久精品日产第一区二区| 久久夜色撩人精品| 亚洲高清在线观看| 欧美精品免费看| 国产一在线精品一区在线观看| 国产主播一区二区三区| 久久五月天婷婷| 麻豆av一区二区三区| 国产精品h在线观看| 国产欧美日韩麻豆91| 在线电影国产精品| 亚洲天堂成人| 亚洲专区欧美专区| 欧美激情欧美狂野欧美精品| 中文在线资源观看网站视频免费不卡 | 久久激情视频| 欧美日本韩国一区二区三区| 亚洲一级二级在线| 欧美国产大片| 欧美一区二区在线免费播放| 欧美日韩国产片| 亚洲人体一区| 欧美伊久线香蕉线新在线| 免费在线成人av| 香蕉亚洲视频| 国产精品久久久久久久久借妻| 在线观看亚洲精品| 亚洲精品之草原avav久久| 久久爱另类一区二区小说| 亚洲美女福利视频网站| 蜜桃av一区二区| 久久久国产精品一区二区三区| 欧美日本二区| 久久天堂国产精品| 国产精品福利网站| 欧美成人精品福利| 国产欧美日韩视频| 亚洲国产欧美一区二区三区久久| 午夜精品久久久久久久久| 欧美视频一区二区三区在线观看 | 欧美日韩精品免费| 另类人畜视频在线| 亚洲网站视频| 欧美私人网站| 亚洲国产中文字幕在线观看| 国产一区99| 这里只有精品视频| 一区二区三区不卡视频在线观看 | 久久蜜臀精品av| 午夜视频在线观看一区二区三区 | 国产在线高清精品| 欧美日韩妖精视频| 欧美午夜宅男影院| 亚洲欧美精品在线观看| 欧美成人资源网| 久久视频免费观看| 国产在线不卡精品| 亚洲美女黄网| 免费亚洲电影| 亚洲人成人99网站| 亚洲五月婷婷| 亚洲欧美日韩第一区| 在线亚洲一区二区| 欧美成人在线免费观看| 亚洲三级影院| 亚洲欧洲日产国产综合网| 欧美激情在线观看| aa成人免费视频| 欧美超级免费视 在线| 国产区精品在线观看| 日韩视频永久免费| 国产精品久久久久久模特| 欧美一区二区网站| 国产精品免费网站| 欧美一区=区| 久久国产手机看片| 极品尤物一区二区三区| 亚洲高清资源综合久久精品| 亚洲欧洲一区二区三区在线观看| 美女91精品| 最新亚洲一区| 亚洲免费在线电影| 国产婷婷色一区二区三区四区| 午夜免费久久久久| 欧美成人免费全部观看天天性色| 在线观看中文字幕不卡| 一区二区三区精品视频在线观看 | 欧美黑人在线播放| 99在线|亚洲一区二区| 欧美午夜视频在线| 亚洲欧美日韩一区在线观看| 久久一区视频| 亚洲免费观看高清在线观看| 欧美日韩国产三区| 午夜精品剧场| 蜜桃av久久久亚洲精品| 日韩视频免费在线观看| 欧美一区二区三区久久精品茉莉花 | 亚洲高清视频在线| 亚洲免费视频中文字幕| 国产主播一区二区三区| 欧美日韩国产精品一区二区亚洲 | 亚洲最新视频在线| 欧美精品一区二区三区在线看午夜 | 久久嫩草精品久久久精品| 亚洲国产精彩中文乱码av在线播放| 亚洲大胆女人| 欧美色图天堂网| 久久爱另类一区二区小说| 日韩视频免费观看高清在线视频| 久久久久久综合网天天| 中国女人久久久| 激情综合激情| 国产精品美女久久久浪潮软件| 久久欧美中文字幕| 亚洲一区二区少妇| 亚洲综合电影一区二区三区| 经典三级久久| 国产精品裸体一区二区三区| 美女视频黄 久久| 午夜欧美大尺度福利影院在线看| 亚洲国产欧美日韩| 久久久精品性| 国产亚洲欧美一区二区| 欧美电影免费观看网站| 午夜视频在线观看一区| 亚洲视频网在线直播| 亚洲黄一区二区| 老司机凹凸av亚洲导航| 久久激情五月婷婷| 午夜亚洲福利| 国产一区二区三区自拍| 欧美日韩在线播放一区| 欧美激情第4页| 久久尤物电影视频在线观看| 久久永久免费| 性欧美videos另类喷潮| 亚洲电影第三页| 精品福利av| 一区在线视频| 在线日韩欧美视频| 亚洲国产成人av| 亚洲国产精品久久久久秋霞蜜臀| 国产一区二区av| 国产一区二区三区在线播放免费观看| 国产精品久久亚洲7777| 国产精品亚洲人在线观看| 国产精品揄拍500视频| 亚洲巨乳在线| 亚洲日本欧美在线| 亚洲精品少妇网址| 一本色道久久综合狠狠躁篇的优点 | 欧美日韩精品综合在线| 欧美日韩国产一级片| 欧美激情一区在线观看| 欧美日韩视频在线一区二区| 欧美人体xx| 欧美日本免费一区二区三区| 欧美午夜精品久久久久久久| 国产精品区一区二区三区| 国产伦精品一区| 一区在线免费| 日韩一本二本av| 国产精品免费视频xxxx| 国产毛片精品视频| 国产视频一区免费看| 在线免费高清一区二区三区| 国产综合网站| 国产精品网站在线播放| 国产综合色产| 亚洲人屁股眼子交8| 亚洲欧美激情视频| 久久免费视频网站| 91久久久国产精品| 亚洲视频一区二区在线观看| 欧美制服第一页| 亚洲高清资源| 一区二区三区久久| 久久精品1区| 欧美日韩国内| 激情文学综合丁香| 亚洲影院色无极综合| 女人香蕉久久**毛片精品| 亚洲国产中文字幕在线观看| 亚洲永久免费观看| 免费成人高清| 国产欧美在线看|