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

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 肥仔 閱讀(1118) 評論(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>
            亚洲日韩欧美视频一区| 欧美二区乱c少妇| 国产日韩在线视频| 欧美亚洲三级| 久久精品91久久久久久再现| 在线精品视频一区二区三四| 欧美精品性视频| 性色av香蕉一区二区| 亚洲国产精品一区在线观看不卡| 在线一区二区三区四区五区| 韩日精品视频| 欧美午夜www高清视频| 久久综合精品国产一区二区三区| 在线性视频日韩欧美| 嫩草伊人久久精品少妇av杨幂| 亚洲综合国产激情另类一区| 亚洲日本在线观看| 在线欧美影院| 亚洲美女一区| 亚洲人午夜精品| 亚洲精品永久免费| 欧美激情片在线观看| 久久精品视频网| 欧美ed2k| 亚洲视频中文| 亚洲欧美日韩国产综合精品二区| 一区二区三区免费观看| 亚洲精品人人| 西西人体一区二区| 欧美激情网站在线观看| 国产一区二区三区在线免费观看| 国产精品一级二级三级| 国产精品v欧美精品v日本精品动漫| 国产精品夜色7777狼人 | 一区二区不卡在线视频 午夜欧美不卡在| 亚洲午夜视频在线观看| 一区二区三欧美| 美女图片一区二区| 蜜臀久久99精品久久久久久9| 亚洲精品美女在线观看| 久久精品盗摄| 久久综合久久综合久久| 国产精品美女久久福利网站| 久久精品视频在线观看| 亚洲高清毛片| 亚洲激情一区二区三区| 亚洲福利视频二区| 小辣椒精品导航| 久久精品在线视频| 久久久久欧美精品| 欧美+亚洲+精品+三区| 亚洲视频第一页| 欧美日韩国内自拍| 国产精品久久波多野结衣| 国产精品视频区| 亚洲精品影院在线观看| 欧美成年人在线观看| 久久久国产视频91| 欧美国产乱视频| 欧美激情影音先锋| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美在线高清视频| 欧美凹凸一区二区三区视频| 欧美亚洲日本网站| 国内外成人在线视频| 91久久国产综合久久91精品网站| 亚洲精选久久| 亚洲日韩欧美视频一区| 欧美日韩国产麻豆| 亚洲一级免费视频| 亚洲男人影院| 欧美裸体一区二区三区| 国产一区二区三区无遮挡| 欧美在线二区| 久久精品一区二区三区中文字幕| 合欧美一区二区三区| 欧美成人精精品一区二区频| 欧美aⅴ99久久黑人专区| 国产精品视频福利| 香蕉成人久久| 久久久久国产精品人| 国产精品v亚洲精品v日韩精品 | 久久亚裔精品欧美| 日韩视频永久免费观看| 香蕉久久久久久久av网站| 国产无一区二区| 开元免费观看欧美电视剧网站| 亚洲精品女人| 欧美精品在线播放| 亚洲淫片在线视频| 久久爱另类一区二区小说| 狠狠色综合一区二区| 欧美激情黄色片| 欧美视频在线观看视频极品| 亚洲国产一区二区a毛片| 亚洲美女网站| 国内精品久久久久国产盗摄免费观看完整版| 美女久久一区| 国产精品乱码一区二三区小蝌蚪| 中国成人亚色综合网站| 久久在线免费观看视频| 99国产精品国产精品毛片| 欧美高清视频在线| 欧美性事在线| 麻豆国产va免费精品高清在线| 欧美精品一区二区三| 久久精品夜色噜噜亚洲a∨| 欧美第一黄色网| 亚洲日本va午夜在线电影| 99热在这里有精品免费| 欧美日韩一区二区国产| 99在线热播精品免费| 欧美国产激情| 国产欧美一区二区精品婷婷| 欧美在线一级va免费观看| 99国内精品久久| 含羞草久久爱69一区| 日韩视频在线观看免费| 1024成人网色www| 亚洲永久视频| 狠狠色噜噜狠狠狠狠色吗综合| 999亚洲国产精| 亚洲国产欧美一区| 欧美在线一二三四区| 国内成人在线| 在线一区二区三区做爰视频网站 | 在线观看日韩av| 欧美成人午夜77777| 国产精品亚洲人在线观看| 亚洲人成网站色ww在线| 在线观看不卡av| 久久久久国产精品一区三寸| 久久超碰97人人做人人爱| 国产精品美女久久久久久2018| 99成人在线| 一区二区av在线| 欧美日韩成人综合天天影院| 亚洲精品一区二区三区樱花| 亚洲三级毛片| 欧美黄色免费| 亚洲国产毛片完整版| 91久久久精品| 欧美激情免费在线| 99精品国产在热久久下载| 中文精品视频| 久久久久久久久久久久久9999 | 亚洲日韩欧美视频一区| 欧美国产日韩视频| 亚洲美女诱惑| 亚洲欧美日韩一区在线| 久久久精品日韩欧美| 久久九九全国免费精品观看| 国模精品一区二区三区色天香| 欧美一级二区| 男人的天堂亚洲| 亚洲丰满在线| 欧美日韩国产免费| 亚洲综合日韩| 欧美激情亚洲精品| 在线亚洲伦理| 在线日韩av永久免费观看| 亚洲一区二区久久| 久久久久欧美| 99re热这里只有精品免费视频| 国产精品爱久久久久久久| 亚洲欧美福利一区二区| 久久久久久久999| 亚洲欧洲日本一区二区三区| 欧美日韩一区在线观看| 午夜精品一区二区三区四区| 欧美成人黄色小视频| 亚洲综合成人在线| 伊人影院久久| 欧美性猛交xxxx乱大交蜜桃| 久久久无码精品亚洲日韩按摩| 亚洲精品免费观看| 久久漫画官网| 亚洲欧美日韩中文视频| 影音先锋久久精品| 国产精品www网站| 老鸭窝91久久精品色噜噜导演| 9i看片成人免费高清| 美女被久久久| 欧美一级久久久久久久大片| 亚洲激情网址| 狠狠干成人综合网| 国产精品国产三级国产普通话蜜臀 | 欧美大胆成人| 久久成人免费电影| 日韩一级不卡| 欧美大香线蕉线伊人久久国产精品| 亚洲一区二区三区色| 91久久久久久| 亚洲国产成人porn| 韩日视频一区| 国产亚洲人成网站在线观看| 欧美午夜免费电影| 欧美激情综合亚洲一二区| 裸体丰满少妇做受久久99精品| 美女91精品|