freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c++模板元編程技術(shù)與應(yīng)用(文件)

2025-10-18 14:39 上一頁面

下一頁面
 

【正文】 的Abstract Factory泛型模式即借助于這種機(jī)制實(shí)現(xiàn)在不損失類型安全性的前提下降低對(duì)類型的靜態(tài)依賴性 。如果該條件不為真,則斷言失敗,程序執(zhí)行中斷。 編譯期斷言的實(shí)現(xiàn)方式并非僅限于模板元編程一種 。 } int main() { STATIC_ASSERT(01)。 這看上去有些臆怪,因此我們把它封裝到宏里: StaticAssert((exp) != 0) StaticAssertFailed。 一個(gè)新的關(guān)鍵字 static_assert極有可能被加入 C++0x, 其作用正如StaticAssert模板 。 例如,結(jié)合運(yùn)用上述 StaticAssert和前面編寫的 IsPointer,可以實(shí)現(xiàn)一個(gè)約束: define CONSTRAINT_MUST_BE_POINTER(T) \ STATIC_ASSERT(IsPointerT::Result != 0) 斷言和契約 在以下類模板中,通過將該約束放在析構(gòu)函數(shù)中, 通常 可以保證模板參數(shù) T必須是一個(gè)指針類型: template typename T class Test { public: … ~Test() { // 只要該類的實(shí)例被創(chuàng)建,約束就會(huì)發(fā)揮作用 CONSTRAINT_MUST_BE_POINTER(T)。 // 違反約束,編譯報(bào)錯(cuò) } 庫 C++模板的語法較復(fù)雜,一些慣用法應(yīng)該采用庫的方式提供。 知名的模板元編程庫有 Loki [注 14] 、 Boost (元編程庫) [注13] 、 Blitz++ [注 15]以及 MTL [注 16]等。 庫 Boost 元編程庫目前主要包含 MPL、 Type Traits和 Static Assert等庫。 Boost Type Traits庫包含一系列 traits類,用于萃取 C++類型特征。這里的 DSEL就是庫,例如一些圖形或矩陣計(jì)算庫都可被認(rèn)為是一種小型語言: 其接口定義語法,其實(shí)現(xiàn)定義語義。 如欲進(jìn)一步了解采用 C++模板元編程實(shí)現(xiàn) DSEL,參見 [注 9]。 std::for_each((), (), (switch_statement(_1, case_statement0(std::cout constant(zero)), case_statement1(std::cout constant(one)), default_statement(cout constant(other: ) _1) ), cout constant(\n) ) )。當(dāng)被編譯器解釋時(shí),模板元程序可以生成高效的代碼,從而可以大幅提高最終應(yīng)用程序的運(yùn)行效率。 代碼的可讀性較差。 David Abrahams在 C++ Template Metaprogramming一書中介紹的 “ 遞歸開解( Recursion Unrolling) ” 技術(shù),可以 “ 突破 ” 編譯器對(duì)模板實(shí)例化層數(shù)的限制。 資源 以下是一些 C++模板元編程資源,它們或者為本幻燈片的制作提供了參考素材,或者提供了延伸知識(shí)。 編譯時(shí)間延長:元程序被編譯器解釋執(zhí)行的, C++編譯器并不是一個(gè)好的解釋器。倘若代碼展開導(dǎo)致程序尺寸過大,可能會(huì)降低 cache的命中率,未必會(huì)帶來性能上的提高。 模板元編程也有一些局限性,使用模板元編程時(shí)(尤其使用模板元編程進(jìn)行數(shù)值計(jì)算時(shí))存在一些注意事項(xiàng) …… 調(diào)試?yán)щy:元程序執(zhí)行于編譯期,沒有用于單步跟蹤元程序執(zhí)行的調(diào)試器(用于設(shè)臵斷點(diǎn)、察看數(shù)據(jù)等)。std::exception::what, _e), throw_exception(bind(constructorbar_exception(), _1))) ), catch_all((cout constant(Unknown), rethrow()) ) ) )。 int i。 利用模板元編程技術(shù)構(gòu)建的 DSEL,高效且語法接近于從頭構(gòu)建的語言。 Boost Static Assert庫用于編譯期斷言,如果評(píng)估的表達(dá)式編譯時(shí)計(jì)算結(jié)果為 true,則代碼可以通過編譯,否則編譯報(bào)錯(cuò)。 MPL是一個(gè)通用的模板元編程框架,它仿照 STL提供了編譯期算法、序列、迭代器等元編程組件。長期以來,科學(xué)計(jì)算一直是 Fortran77/90的地盤,而 Blitz++利用元編程(以及表達(dá)式模板等)技術(shù)可以獲得和 Fortran77/90媲美的效率(參見 [注 4])。庫中出現(xiàn)大量的繁雜的代碼是可以接受的,因?yàn)檫@樣的工作只需做一次,而所有庫的用戶均可從中受益。 我們沒有將它放臵于構(gòu)造函數(shù)中 , 因?yàn)闃?gòu)造函數(shù)可能不止一個(gè) …… int main() { Testint* r。 編譯期契約也被稱為約束( constraints)。 has inplete type and cannot be defined 注意:表達(dá)式必須能夠在編譯期進(jìn)行求值 , 無法對(duì)運(yùn)行期表達(dá)式進(jìn)行求值 。 在有些編譯器(例如 GCC和Borlad C++)中編譯報(bào)錯(cuò),在另外一些編譯器(例如 VC++和 Digital Mars)中則可以編譯通過。 // 完全特化 template struct StaticAsserttrue {}。當(dāng)然,若 有可能,在編譯期抓住錯(cuò)誤更好。 可以利用元編程技術(shù)實(shí)現(xiàn) 編譯期斷言 和 編譯期約束 。 示例中生成了一個(gè)多重繼承類層次結(jié)構(gòu), Holderchar, Holderint, Holderfloat, HolderTest之間沒有任何關(guān)系,但它們都是 SH的基類,即所產(chǎn)生的 SH層次結(jié)構(gòu)其實(shí)相當(dāng)于: class SH: public Holderchar, public Holderint, public HolderTest, public Holderfloat。 // cout (dynamic_castHolderdoubleamp。 cout (dynamic_castHolderfloatamp。a39。 typedef GenScatterHierarchyCIRF, Holder SH。 template typename T struct Holder { T Value。 template class AtomicType, template class class Unit struct GenScatterHierarchy : public UnitAtomicType {}。 typedef T Tail。 代碼生成 此例摘自 Lokiamp。 int main() { IfThenElse(true), A, B::ResultType::execute()。 代碼生成 struct A { static void execute() { cout A endl。 //IsPointerint::ValueType j = 1。 }。 typedef Nil ValueType。 實(shí)踐證明,對(duì)于現(xiàn)代 C++編程而言, 元編程最大的用場本并不在于編譯期數(shù)值計(jì)算,而是用于類型計(jì)算( type putation)(及相關(guān)領(lǐng)域)。 int b[5] = { 6, 7, 8, 9, 10}。 } }。元編程在該領(lǐng)域最早的應(yīng)用是實(shí)現(xiàn)“循環(huán)開解( Unroll Loop)”。 // 1 cout IsEmptytree2::Result endl。 數(shù)據(jù)結(jié)構(gòu) // 示例 typedef BTreeLEA
點(diǎn)擊復(fù)制文檔內(nèi)容
黨政相關(guān)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1