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

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>
            欧美中文字幕久久| 你懂的视频一区二区| 91久久综合亚洲鲁鲁五月天| 久久久国际精品| 欧美专区在线| 欧美一区二区三区免费在线看| 亚洲午夜羞羞片| 亚洲女性裸体视频| 欧美中文在线观看国产| 久久久亚洲精品一区二区三区| 久久精品国产一区二区三| 欧美一区日本一区韩国一区| 久久亚洲精品视频| 亚洲电影观看| 一区二区免费看| 狂野欧美激情性xxxx| 亚洲午夜电影| 亚洲桃花岛网站| 欧美亚洲日本网站| 久久久亚洲影院你懂的| 欧美激情网友自拍| 一本色道久久综合亚洲精品按摩| 中文精品一区二区三区| 欧美一级电影久久| 欧美二区视频| 国产精品美女久久久免费 | 欧美激情自拍| 日韩视频一区二区| 亚洲欧美一区在线| 欧美成人情趣视频| 国产欧美一区二区精品忘忧草 | 欧美电影电视剧在线观看| 欧美视频成人| 伊人夜夜躁av伊人久久| 亚洲一本视频| 麻豆91精品| 亚洲一二区在线| 农夫在线精品视频免费观看| 国产九九精品视频| 一区二区日韩伦理片| 鲁大师影院一区二区三区| 这里只有精品丝袜| 欧美搞黄网站| 黄色资源网久久资源365| 亚洲欧美不卡| 亚洲精品国产精品国自产在线| 欧美怡红院视频一区二区三区| 欧美日韩免费网站| 亚洲国产欧美国产综合一区| 欧美伊人久久大香线蕉综合69| 亚洲国产综合91精品麻豆| 久久精品系列| 国产亚洲欧美中文| 亚洲欧美视频| 亚洲尤物在线| 欧美日韩在线观看一区二区三区| 好吊色欧美一区二区三区视频| 亚洲欧美日韩精品综合在线观看| 亚洲国产高清自拍| 麻豆精品视频在线| 永久555www成人免费| 欧美在线播放高清精品| 在线一区二区日韩| 亚洲美女av电影| 欧美天天视频| 男女激情久久| 免费视频一区| 久久精彩视频| 欧美日韩国产精品一卡| 欧美在线观看视频| 欧美午夜www高清视频| 美女性感视频久久久| 国产精品国产三级国产| 欧美成人午夜免费视在线看片| 国产精品一区免费观看| 一本色道久久| 亚洲一区尤物| 欧美成人在线免费观看| 日韩亚洲精品视频| 午夜精品影院在线观看| 国产精品进线69影院| 久久久久国产精品厨房| 亚洲永久免费观看| 国产亚洲精品久| 久久免费视频网| 久久久噜噜噜久久| 99热免费精品| 国产精品99久久不卡二区| 国产精品一区二区女厕厕| 久久精品系列| 欧美风情在线| 欧美亚洲在线观看| 久久综合婷婷| 亚洲午夜在线观看视频在线| 亚洲欧美日韩综合| 最新69国产成人精品视频免费| 日韩一二三区视频| 国产一区二区你懂的| 91久久夜色精品国产网站| 欧美四级伦理在线| 久久综合激情| 国产精品成人午夜| 好吊色欧美一区二区三区视频| 亚洲精品国产精品国自产在线| 亚洲日本成人| 国产视频不卡| 久久不射中文字幕| 久久久久久免费| 亚洲视频免费在线观看| 欧美亚洲一区三区| 日韩视频在线观看一区二区| 亚洲主播在线| 日韩视频精品| 久久九九国产精品| 亚洲欧美日韩在线| 欧美成人激情在线| 久久精品国产999大香线蕉| 欧美高清在线播放| 麻豆成人综合网| 国产伦一区二区三区色一情| 91久久综合| 亚洲国产成人在线视频| 午夜在线a亚洲v天堂网2018| 一本色道久久综合狠狠躁篇的优点| 欧美一区二区免费视频| 亚洲性感美女99在线| 欧美77777| 欧美fxxxxxx另类| 国外视频精品毛片| 欧美一区二区三区在线观看| 欧美亚洲在线观看| 国产美女精品| 欧美一级播放| 久久女同互慰一区二区三区| 国内精品久久久久久| 欧美伊久线香蕉线新在线| 久久er精品视频| 国产午夜精品久久久久久久| 亚洲欧美中文日韩v在线观看| 亚洲女优在线| 国产精品性做久久久久久| 亚洲欧美久久久| 久久精品日韩| 亚洲第一偷拍| 欧美黑人在线观看| 亚洲狼人综合| 亚洲欧美一区二区激情| 国产欧美日韩亚洲一区二区三区| 亚洲欧美日本国产有色| 久久久久久久网| 亚洲国产成人不卡| 欧美成人精品在线观看| 亚洲精品中文字幕女同| 亚洲视频专区在线| 国产精品视频最多的网站| 欧美一二三区在线观看| 老司机精品视频网站| 亚洲激情视频在线播放| 欧美二区在线| 夜夜嗨av一区二区三区| 香蕉久久夜色精品国产| 国产精品区一区| 欧美一区二区大片| 久久免费99精品久久久久久| 欧美绝品在线观看成人午夜影视| 欧美激情第二页| 亚洲国产欧美日韩| 男女激情视频一区| 亚洲无限av看| 欧美在线在线| 亚洲综合大片69999| 亚洲一区二区三区乱码aⅴ蜜桃女| 性久久久久久久| 国产美女扒开尿口久久久| 亚洲综合好骚| 亚洲最新视频在线| 国产一区二区三区av电影| 欧美在线播放| 欧美a级理论片| 欧美天堂亚洲电影院在线观看| 性色一区二区三区| 麻豆成人小视频| 日韩视频不卡中文| 欧美日韩国产黄| 久久午夜电影| 日韩视频一区| 久久激情中文| 午夜日韩在线| 亚洲国产精品久久久久婷婷老年 | 久久黄色网页| 亚洲午夜久久久久久久久电影院| 欧美在线视频a| 亚洲人体影院| 国产精品日韩欧美一区二区三区| 欧美福利电影网| 午夜视黄欧洲亚洲| 亚洲韩国青草视频| 日韩亚洲在线| 亚洲精选久久| 国产视频精品va久久久久久|