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

woaidongmao

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

STL中的Concept和Boost庫的Concept_Check

在generic programming當(dāng)中,一個重要的概念就是concept(滑稽的是,如果把這個concept也翻譯成“概念”,那就狗屁不通了。我傾向于說它是“操作集”)。concept就是一組操作,如果一個type具有這些操作,那么就說這個type是這個concept的一個model。
這其中的思想有那么一丁點(diǎn)像是oo當(dāng)中的interface,一個class如果實(shí)現(xiàn)了一個interface,那么它就可以被當(dāng)作這個interface來用。同樣,如果一個type是一個concept的model,那么所有接受這個concept的操作也就可以接受這個type。
例如,在stl中,stable_sort這個算法必須接受randomaccessiterator,這里randomaccessiterator就是一個concept,它規(guī)定自己的model必須可以進(jìn)行下標(biāo)運(yùn)算,那么不滿足這個concept的type就無法被編譯器接受(搞笑的是我在vc71里面把list<int> 的iterator傳給stable_sort,它居然欣然接受,要知道list的iterator應(yīng)該只是一個bidirectionaliterator 啊,比randomaccessiterator弱多了。不過仔細(xì)看看代碼,發(fā)現(xiàn)vc71的stable_sort接受bidirectionaliterator就夠了,不知道是好還是壞)。在gcc下面如果傳遞一個bidirectionaliterator給stable_sort,會得到一堆不知所云的錯誤提示,讓人摸不著頭腦。
c++語言本身并沒有對于concept的直接支持,stl解決這個問題的辦法是用了一些traits來限制iterator的特性,以達(dá)到在編譯時期檢查concept的目的。但是traits導(dǎo)致的編譯錯誤提示實(shí)在是太可怕了,我非常懷疑有哪個正常人可以從這些錯誤提示推測出自己錯在哪里。
在boost庫里面,提供了一個conceptcheck庫,它可以幫助我們寫出帶有concept檢查的代碼,而且沒有運(yùn)行時的開銷,一旦用戶違反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: 二進(jìn)制“+=” : “std::list<_ty>::iterator”不定義該運(yùn)算符或到預(yù)定義運(yùn)算符可接收的類型的轉(zhuǎn)換
        with
        [
            _ty=int
        ]
當(dāng)然還有很多別的,但是至少它說了一點(diǎn):傳入的iterator不滿足某個運(yùn)算。這對于用戶來說,應(yīng)當(dāng)是一個很有用的提示。
使用concept check還有一個額外的好處,那就是調(diào)用一個 function_requires可遠(yuǎn)比寫一些traits容易,而且代碼也清晰好維護(hù)。

這個好用的 function_requires 就定義在concept_check.hpp當(dāng)中:
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當(dāng)中它就添加了overhead呢?其實(shí)也沒有,仔細(xì)看看代碼:
void (concept::*x)() = boost_fptr concept::constraints;
這一句取constraints的地址。妙就妙在它讓編譯器“注意到”constraints,但又沒有真正調(diào)用constraints,而constraints是一個虛函數(shù),做實(shí)際的check。例如在randomaccessiteratorconcept(檢查iterator是否符合randomaccessiterator的concept)當(dāng)中,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
};
從這個實(shí)現(xiàn)中我們完全可以讀出randomaccessiterator的具體含義:
1. 它必須是一個bidirectionaliterator
2. 它必須滿足“可比較 (comparable)”的concept
3. 它還必須滿足“可轉(zhuǎn)換 (convertible)”的concept,而且是轉(zhuǎn)換成自己的iterator_category類別

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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国产| 久久综合给合久久狠狠狠97色69| 免费视频最近日韩| 一本大道久久精品懂色aⅴ| 亚洲网站在线看| 久久视频一区| 欧美三级乱人伦电影| 国产揄拍国内精品对白| 亚洲国产91精品在线观看| 在线一区亚洲| 久久人91精品久久久久久不卡| 亚洲国产成人在线播放| 玖玖综合伊人| 99精品视频免费在线观看| 亚洲作爱视频| 卡一卡二国产精品| 欧美日韩在线电影| 怡红院精品视频在线观看极品| 亚洲第一免费播放区| 亚洲男女毛片无遮挡| 免费欧美日韩| 亚洲欧美日韩系列| 欧美激情一区三区| 韩国av一区二区三区四区| 一区二区三区日韩精品视频| 久久久噜噜噜久久中文字幕色伊伊 | 99在线精品视频| 久久久久久尹人网香蕉| 亚洲精品永久免费| 久久精品视频免费观看| 国产精品xnxxcom| 在线视频国内自拍亚洲视频| 亚洲欧美日韩一区二区在线| 亚洲大片免费看| 久久精品视频亚洲| 国产午夜精品麻豆| 性色av一区二区三区| 亚洲日本中文字幕免费在线不卡| 久久国产精品色婷婷| 欧美日韩高清区| 亚洲国产一区二区a毛片| 久久视频这里只有精品| 亚洲一区二区免费| 国产精品成人va在线观看| 欧美精品在线观看一区二区| 香蕉成人久久| 亚洲国产高清视频| 久久久久久网| 黄色亚洲免费| 可以免费看不卡的av网站| 亚洲综合精品四区| 国产日韩欧美日韩| 久久久国产成人精品| 午夜综合激情| 韩国av一区二区三区在线观看 | 国产一区二区高清不卡| 亚洲欧美日韩爽爽影院| 亚洲免费综合| 国产美女搞久久| 欧美中文字幕| 久久精品一级爱片| 亚洲高清不卡av| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲美女毛片| 欧美色播在线播放| 欧美一区二区三区四区高清| 亚洲欧美日韩在线一区| 国产精品午夜在线| 久久久久久久高潮| 噜噜噜在线观看免费视频日韩| 尤物yw午夜国产精品视频明星| 毛片基地黄久久久久久天堂| 久久久www成人免费无遮挡大片| 亚洲电影免费观看高清完整版| 欧美大片一区二区| 欧美日本一区| 久久久国产视频91| 欧美激情精品久久久六区热门 | 在线成人小视频| 亚洲国产成人久久| 国产精品视频九色porn| 久久一区中文字幕| 欧美人与性动交cc0o| 亚洲欧美另类中文字幕| 久久国产精品99久久久久久老狼| 亚洲黄一区二区| 亚洲一区二区免费视频| 亚洲高清不卡| 亚洲欧美日韩天堂一区二区| 亚洲精品一区二区三区不| 亚洲欧美在线另类| av不卡在线观看| 欧美一区午夜精品| 日韩视频专区| 久久成人免费网| 夜久久久久久| 久久免费的精品国产v∧| 亚洲天堂成人| 国产精品啊啊啊| 欧美激情第一页xxx| 欧美日韩综合| 欧美高清免费| 国产伊人精品| 在线中文字幕日韩| 亚洲人www| 久久精品中文字幕免费mv| 亚洲午夜电影| 欧美99在线视频观看| 久久久久久久久蜜桃| 国产精品xxxxx| 日韩手机在线导航| 亚洲人体影院| 久久天堂国产精品| 久久理论片午夜琪琪电影网| 国产精品国产三级国产普通话99 | 日韩视频一区二区三区在线播放| 国产一区欧美| 午夜精品在线视频| 亚洲欧美视频一区二区三区| 欧美成人日韩| 亚洲国产精品国自产拍av秋霞| 在线不卡a资源高清| 欧美在线日韩精品| 久久这里只有精品视频首页| 国产亚洲观看| 欧美在线视频播放| 久久久久一区二区| 国内综合精品午夜久久资源| 亚洲免费小视频| 欧美一级夜夜爽| 国产欧美日韩91| 亚洲天堂免费观看| 亚洲综合精品四区| 国产精品v欧美精品v日韩 | 久久精品九九| 国产一区视频网站| 久久蜜桃资源一区二区老牛| 免费看亚洲片| 日韩视频―中文字幕| 欧美日韩中文在线| 亚洲欧美国产高清| 噜噜噜久久亚洲精品国产品小说| 在线观看日韩av电影| 免费国产一区二区| 亚洲精品久久久久久下一站| 99re亚洲国产精品| 国产精品大片| 欧美一区二区三区在线观看 | 在线一区观看| 国产美女一区二区| 久久久精品欧美丰满| 欧美激情一区二区三区在线视频 | 美女脱光内衣内裤视频久久网站| 欧美91大片| 日韩视频在线观看一区二区| 欧美视频精品在线| 欧美一区二区三区喷汁尤物| 免费日韩成人| 国内精品国产成人| 亚洲一区免费在线观看| 国产女人aaa级久久久级| 久久久国产精品一区二区三区| 欧美成年人网站| 亚洲一区二区三区四区视频| 国产午夜精品一区二区三区视频 | 亚洲三级性片| 国产精品免费观看在线| 久久人人爽人人| 在线亚洲精品| 欧美福利在线观看| 欧美在线播放一区| 日韩视频在线永久播放| 国内精品久久久久久久97牛牛| 欧美激情aⅴ一区二区三区 | 欧美激情精品久久久久| 亚洲综合视频网| 亚洲精品国精品久久99热一| 久久精品国产亚洲aⅴ| 日韩图片一区| 尤物九九久久国产精品的特点| 国产精品av一区二区| 欧美大片18| 久久影音先锋| 久久国产精彩视频| 亚洲欧美精品一区| 一本色道久久88亚洲综合88| 免费在线视频一区| 久久久久久久性| 久久精品30| 欧美伊人久久大香线蕉综合69| 这里只有精品在线播放|