• <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>

            woaidongmao

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

            什么元素可以作為模板參數的實參

            在C++中模板分為兩大類別:類模板和函數模板。這兩種類別的模板在語法形式上是相同
            的,只是各自存在一些特別的約束。那么什么樣的C++元素可以作為實參來替換模板中的形參
            呢?這里又主要分成兩大類實參類型:
                1. 類型實參
                   類型實參實際上就是C++中間的各種各樣的數據類型,包括POD類型和類類型。比如:
                   char、int、int*、int&、float和用戶定義的類型。
                  
                2. 非類型實參
                   非類型實際上就是值的意思,而要作為模板實參的值就必須是一個常量值,更準確
                   的說就必須是一個在編譯期能夠確定的值(簡稱編譯期常量),然而編譯期常量在
                   C++中包含了非常廣泛的概念,也不是所有的編譯期常量都可以作為模板的實參的,
                   也就是僅僅只有編譯期常量的一個子集可以作為模板實參,那么什么編譯期常量可
                   以作為模板實參呢?主要有三種類型的編譯期常量:
                      a. 整型常量
                         在C++中所謂的整型包括char、short、int、long、long long、上述類型的
                         無符號類型、wchar_t、enum類型。其中要注意的是float和double類型是不
                         可以作模板實參的(在C++0x標準中會改變這一狀況)。
                      b. 函數地址
                         函數地址主要包括非成員函數地址、成員函數地址、靜態成員函數地址。
                      c. 具有外部引用的字符串數組
                         什么是具有外部引用的字符串數組呢?就是具有如下形式:
                             extern char cstr[]; // 可以初始化,如:extern char cstr[] = ""
                                                 // char也可以是wchar_t
                         需要注意的是extern char *cstr;所聲名的是一個指針而不是一個數組,所
                         以不能夠用作模板的實參。那么在作為模板實參的時候是采用了cstr所包含
                         的字符串值作為模版實參的嗎,其實不是,雖然cstr是一個字符串,其實在
                         作為模板實參是僅僅用到了cstr的地址,也就是說如下的定義是合法的:
                             extern char cstr1[] = "cstr";
                             extern char cstr2[] = "cstr";
                            
                             template<char *V> struct CTemplateValue {};
                             // 或者 template<char V[]> struct CTemplateValue {};
                             template<> struct CTemplateValue<cstr1> {};
                             template<> struct CTemplateValue<cstr2> {};
                         上面的代碼中,cstr1和cstr2都包含有相同的字符串值,但是在作為模板實參
                         時并沒有參考cstr1和cstr2的內容,而是依賴于其地址,所以可以進行模板的
                         特化,而不出現重復特化的編譯時錯誤。         
                   總的來說這里上面的三種常量都是編譯期常量,對于第一種情況是比較好理解的,而
                   對于第二三種請款可能就不那么直觀了,為什么函數地址和外部引用的字符串是編譯
                   期常量呢?首先我們來解釋一下編譯器在編譯函數和全局外部引用的變量時會如何處
                   理這兩者的地址,以使得其他的代碼或模塊能夠順利地找到該地址并調用函數或引用
                   變量。
                   首先可以肯定的是編譯器必須為函數和全局外部引用的變量生成唯一的入口地址,否
                   則就無法引用了;
                   其次編譯器會生成什么樣的地址呢?地址分為:物理地址(PA)和虛擬地址(RVA),
                   目前編譯器一般不會生成物理內存地址的,因為基本上所有的程序在操作系統調度運
                   行時均不可能保證該物理內存地址可以被分配給該程序使用(可能已經被其他的程序
                   占用了),那么現在的編譯器均會選擇生成RVA地址,其實RVA地址是相對于程序載入
                   首地址的一個偏移常量(offset),那么操作系統在載入程序時僅僅需要修改程序的
                   載入首地址就可以完成程序的載入,而程序內部在調用一個函數或引用變量時會采用
                   首地址+RVA地址的方法來完成引用,這樣一來RVA就成為了一個編譯期的整型常量了,
                   所以函數地址和全局外部引用字符串的地址就成為了編譯期的常量,可以作為模板實
                   參了。那為什么必須是外部引用的字符串數組呢?內部引用的字符串數組不可以么?
                   如果對此有興趣可以關注后續相關內外部引用的討論blog。

            Feedback

            # re: 什么元素可以作為模板參數的實參  回復  更多評論  

            2007-06-01 12:29 by walkspeed
            快出后續呀。

            如果推論的話,內部字符串是個非編譯器常量啦。

            這種分析很透徹,不光停留在表面上,而且講清楚了其在編譯時的特性。模板本來就是用來控制編譯期的。所以對編譯器在編譯期的了解越深刻,也容易理解模板編程。

            非類型實際上就是值的意思,而要作為模板實參的值就必須是一個常量值,更準確
            的說就必須是一個在編譯期能夠確定的值(簡稱編譯期常量)。記住這句話

            # re: 什么元素可以作為模板參數的實參  回復  更多評論  

            2007-06-04 14:08 by picasa
            分析的挺好

            posted on 2008-08-31 21:53 肥仔 閱讀(573) 評論(0)  編輯 收藏 引用 所屬分類: C++ 模板

            亚洲国产高清精品线久久| 久久综合狠狠综合久久综合88| 粉嫩小泬无遮挡久久久久久| 久久精品国产亚洲av日韩| 欧美一区二区精品久久| 99久久免费国产精品特黄| 久久综合狠狠综合久久综合88| 国产2021久久精品| 久久久久这里只有精品| 婷婷久久久亚洲欧洲日产国码AV| 久久久久久综合一区中文字幕| 无码人妻久久一区二区三区蜜桃| 亚洲αv久久久噜噜噜噜噜| 久久狠狠色狠狠色综合| 国产精品成人久久久| 91久久香蕉国产熟女线看| 精品久久久久久国产| 久久这里只有精品视频99| 国产精品久久久久9999高清| 日产精品久久久久久久| 久久青青草原精品国产不卡| 久久―日本道色综合久久| 久久影院综合精品| 久久精品国产日本波多野结衣| yellow中文字幕久久网| 国产精品久久久久影视不卡| 少妇内射兰兰久久| 久久综合亚洲色HEZYO社区 | 精品久久综合1区2区3区激情| 亚洲国产精品一区二区久久hs| 思思久久99热免费精品6| 久久91综合国产91久久精品| 久久久久久午夜成人影院| 无码国产69精品久久久久网站| 伊人久久大香线蕉av不变影院| 久久精品国产2020| 亚洲va中文字幕无码久久不卡| 婷婷伊人久久大香线蕉AV| 久久天天躁狠狠躁夜夜96流白浆| 午夜精品久久久久久99热| 99久久国产精品免费一区二区 |