久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營的一線實(shí)戰(zhàn)洞察。

C++成員函數(shù)模板:從泛型設(shè)計(jì)到編譯優(yōu)化實(shí)戰(zhàn)

C++成員函數(shù)模板:從泛型設(shè)計(jì)到編譯優(yōu)化實(shí)戰(zhàn) 1. 從“泛型”到“特化”為什么需要成員函數(shù)模板在C的模板世界里我們早已習(xí)慣了編寫通用的類模板比如一個(gè)VectorT它可以容納任何類型的元素。但當(dāng)我們深入到類的成員函數(shù)時(shí)一個(gè)更精細(xì)的需求浮現(xiàn)出來一個(gè)特定類可能是模板類也可能是普通類的某個(gè)成員函數(shù)希望其自身能對不同的參數(shù)類型表現(xiàn)出泛型行為。這就是成員函數(shù)模板Member Function Templates登場的核心場景。讓我用一個(gè)經(jīng)典的“賦值”或“拷貝”問題來切入。假設(shè)我們有一個(gè)簡單的MyString類內(nèi)部管理一個(gè)char*資源class MyString { public: MyString(const char* str nullptr) { // ... 分配內(nèi)存并拷貝str } MyString(const MyString other) { // ... 深拷貝構(gòu)造函數(shù) } ~MyString() { delete[] data_; } // 傳統(tǒng)的拷貝賦值運(yùn)算符 MyString operator(const MyString other) { if (this ! other) { delete[] data_; // ... 重新分配內(nèi)存并拷貝other.data_ } return *this; } private: char* data_; };現(xiàn)在如果我有一個(gè)std::string對象或者一個(gè)C風(fēng)格字符串字面量我想用它來給MyString對象賦值傳統(tǒng)的做法是重載operatorMyString operator(const std::string str) { // 從std::string轉(zhuǎn)換賦值 } MyString operator(const char* str) { // 從C字符串賦值 }這在小范圍內(nèi)可行但如果未來又出現(xiàn)了std::string_view、QString或其他自定義字符串類呢我們需要為每一種可能的類型都重載一個(gè)賦值運(yùn)算符。這不僅代碼冗余而且違反了“對擴(kuò)展開放對修改關(guān)閉”的原則。成員函數(shù)模板正是為了解決這類問題而生。它允許我們在類內(nèi)部定義一個(gè)模板函數(shù)作為成員。對于上面的例子我們可以定義一個(gè)模板化的賦值運(yùn)算符class MyString { public: // ... 其他成員同上 // 成員函數(shù)模板模板化的拷貝賦值運(yùn)算符 templatetypename T MyString operator(const T str) { // 這里需要一個(gè)從T到MyString的“轉(zhuǎn)換”邏輯 // 例如可能調(diào)用一個(gè)輔助函數(shù)或使用traits // 暫時(shí)用偽代碼表示 *this MyString(convert_from_T(str)); return *this; } };這樣只要類型T能夠通過某種方式比如有對應(yīng)的轉(zhuǎn)換構(gòu)造函數(shù)或轉(zhuǎn)換函數(shù)轉(zhuǎn)換成MyString這個(gè)賦值運(yùn)算符就能工作。成員函數(shù)模板的本質(zhì)是讓類的某個(gè)具體成員獲得獨(dú)立于類本身的泛型能力。它特別適用于實(shí)現(xiàn)“類型轉(zhuǎn)換構(gòu)造函數(shù)”但本身是模板、賦值運(yùn)算符、以及一些需要接受多種類型參數(shù)的通用算法成員比如std::unique_ptr的reset函數(shù)可以接受任何自定義刪除器。注意成員函數(shù)模板不能是虛函數(shù)virtual。這是因?yàn)樘摵瘮?shù)表vtable的機(jī)制要求在編譯時(shí)就必須確定函數(shù)的地址而模板的實(shí)例化是編譯期的但具體實(shí)例化出多少個(gè)版本在編譯前是不確定的這與虛函數(shù)動(dòng)態(tài)綁定的運(yùn)行時(shí)機(jī)制相沖突。2. 成員函數(shù)模板的語法、定義與實(shí)例化過程理解了為什么需要之后我們來看看具體怎么寫。成員函數(shù)模板的語法與普通函數(shù)模板幾乎一致只是它被定義在類的內(nèi)部。2.1 基本語法與類內(nèi)/外定義在類內(nèi)定義 這是最常見的形式模板聲明和定義都放在類體內(nèi)。class Buffer { private: void* data_; size_t size_; public: // 構(gòu)造函數(shù)等... // 成員函數(shù)模板將數(shù)據(jù)拷貝到目標(biāo)指針 templatetypename T void copyTo(T* dest, size_t count) const { // 靜態(tài)斷言確保目標(biāo)類型T的大小與緩沖區(qū)元素大小兼容假設(shè)我們存儲(chǔ)的是字節(jié) // 這里只是一個(gè)示例實(shí)際邏輯更復(fù)雜 static_assert(std::is_trivially_copyable_vT, “T must be trivially copyable”); if (count * sizeof(T) size_) { throw std::out_of_range(“Copy exceeds buffer size”); } std::memcpy(dest, data_, count * sizeof(T)); } };在類外定義 當(dāng)成員函數(shù)模板比較復(fù)雜時(shí)為了代碼清晰可以只在類內(nèi)聲明在類外定義。這時(shí)語法需要特別注意作用域和模板參數(shù)的書寫。// MyContainer.h templatetypename ElemType class MyContainer { ElemType* arr_; int size_; public: // 聲明一個(gè)成員函數(shù)模板 templatetypename Iter void assign(Iter begin, Iter end); }; // MyContainer.cpp (或者直接在.h中實(shí)現(xiàn)因?yàn)槟0逋ǔP枰梢姸x) templatetypename ElemType // 這是類模板的參數(shù)列表 templatetypename Iter // 這是成員函數(shù)模板自己的參數(shù)列表 void MyContainerElemType::assign(Iter begin, Iter end) { // 實(shí)現(xiàn)將[begin, end)區(qū)間的元素賦值到容器中 // 需要迭代器解引用后的類型能轉(zhuǎn)換為ElemType int i 0; for (auto it begin; it ! end i size_; it, i) { arr_[i] *it; // 這里隱含了類型轉(zhuǎn)換 } }這里的關(guān)鍵是雙重template語法第一行是類模板的參數(shù)第二行才是成員函數(shù)模板自己的參數(shù)。這清晰地表明了assign是MyContainerElemType這個(gè)具體實(shí)例化類的成員同時(shí)它自己又是一個(gè)模板。2.2 實(shí)例化隱式與顯式成員函數(shù)模板的實(shí)例化遵循函數(shù)模板的規(guī)則用到時(shí)才實(shí)例化。隱式實(shí)例化 這是最常用的方式。編譯器在遇到代碼中調(diào)用成員函數(shù)模板時(shí)根據(jù)傳遞的實(shí)參推導(dǎo)出模板參數(shù)T然后生成對應(yīng)T類型的函數(shù)實(shí)例。Buffer buf; int intArray[10]; float floatArray[10]; buf.copyTo(intArray, 10); // 編譯器隱式實(shí)例化出 void Buffer::copyToint(int*, size_t) buf.copyTo(floatArray, 5); // 編譯器隱式實(shí)例化出 void Buffer::copyTofloat(float*, size_t)這兩行代碼會(huì)導(dǎo)致編譯器生成兩個(gè)不同版本的copyTo函數(shù)。它們只存在于當(dāng)前編譯單元.obj文件中。如果另一個(gè).cpp文件也以同樣的方式調(diào)用了buf.copyToint那么在鏈接時(shí)鏈接器會(huì)處理這些重復(fù)的實(shí)例通常選擇保留一個(gè)。隱式實(shí)例化的一個(gè)核心特點(diǎn)是惰性Lazy。如果你從未用double類型調(diào)用過copyTo那么void Buffer::copyTodouble(double*, size_t)這個(gè)函數(shù)就永遠(yuǎn)不會(huì)被生成。這有助于減少最終二進(jìn)制文件的大小。3. 模板的顯式實(shí)例化控制編譯膨脹與分離編譯當(dāng)項(xiàng)目規(guī)模變大模板被廣泛用于多個(gè)源文件時(shí)隱式實(shí)例化會(huì)帶來兩個(gè)顯著問題編譯時(shí)間膨脹同一個(gè)模板實(shí)例例如MyContainerint::assignstd::vectorint::iterator可能在幾十個(gè).cpp文件中被重復(fù)編譯嚴(yán)重拖慢編譯速度。代碼膨脹每個(gè)編譯單元都有一份該實(shí)例的代碼雖然鏈接器會(huì)去重但編譯過程中的工作量是實(shí)實(shí)在在的。顯式實(shí)例化Explicit Instantiation就是為了解決這些問題而設(shè)計(jì)的。它允許我們在一個(gè)特定的位置通常是一個(gè)單獨(dú)的.cpp文件明確地告訴編譯器“請?jiān)谶@里為我生成這個(gè)特定模板參數(shù)的實(shí)例化版本?!?這樣其他所有用到該實(shí)例的文件都只需要聲明而不需要看到模板的定義從而可以實(shí)現(xiàn)一定程度的“分離編譯”。3.1 語法與使用場景顯式實(shí)例化的語法很簡單template關(guān)鍵字后跟一個(gè)完整的模板實(shí)例化。對于函數(shù)模板包括成員函數(shù)模板// 假設(shè)在某個(gè)頭文件 helper.h 中聲明了函數(shù)模板 templatetypename T T add(const T a, const T b); // 在 helper.cpp 中我們可以顯式實(shí)例化幾個(gè)常用類型 template int addint(const int, const int); template double adddouble(const double, const double); // 或者省略模板參數(shù)由編譯器推導(dǎo)如果可能 template float add(const float, const float);對于類模板的成員函數(shù)// MyContainer.h templatetypename T class MyContainer { public: templatetypename U void merge(const MyContainerU other); void sort(); }; // 在 MyContainer_inst.cpp 中 #include “MyContainer.h” // 顯式實(shí)例化整個(gè) MyContainerint 類 template class MyContainerint; // 這會(huì)導(dǎo)致 MyContainerint 的所有成員包括非模板成員sort都被實(shí)例化。 // 或者更精細(xì)地只顯式實(shí)例化某個(gè)成員函數(shù)模板的特定版本 template void MyContainerint::mergedouble(const MyContainerdouble); // 這里我們顯式實(shí)例化了 MyContainerint::mergedouble 這個(gè)函數(shù)。3.2 如何與分離編譯結(jié)合這是顯式實(shí)例化最有價(jià)值的應(yīng)用。目標(biāo)是讓模板的定義.cpp和聲明.h分離減少頭文件的依賴和編譯時(shí)間。傳統(tǒng)模板必須定義在頭文件// vector_utils.h #ifndef VECTOR_UTILS_H #define VECTOR_UTILS_H #include vector templatetypename T T sum(const std::vectorT vec) { // 定義必須在頭文件里 T total{}; for (const auto elem : vec) total elem; return total; } #endif任何包含vector_utils.h的文件在修改sum的實(shí)現(xiàn)時(shí)都需要重新編譯。使用顯式實(shí)例化實(shí)現(xiàn)分離// vector_utils.h (聲明) #ifndef VECTOR_UTILS_H #define VECTOR_UTILS_H #include vector templatetypename T T sum(const std::vectorT vec); // 只有聲明 #endif // vector_utils.cpp (定義 顯式實(shí)例化) #include “vector_utils.h” templatetypename T T sum(const std::vectorT vec) { T total{}; for (const auto elem : vec) total elem; return total; } // 顯式實(shí)例化我們期望支持的類型 template int sumint(const std::vectorint); template double sumdouble(const std::vectordouble); template float sumfloat(const std::vectorfloat); // main.cpp (使用) #include “vector_utils.h” // 只包含聲明 #include vector int main() { std::vectorint v {1, 2, 3}; int s sum(v); // 鏈接時(shí)找到 vector_utils.cpp 中生成的實(shí)例 return 0; }在這種模式下main.cpp只包含了聲明不知道sum的具體實(shí)現(xiàn)。當(dāng)它調(diào)用sumint時(shí)編譯器相信這個(gè)函數(shù)會(huì)在其他地方vector_utils.cpp被定義。vector_utils.cpp獨(dú)立編譯一次生成了sumint,sumdouble,sumfloat的二進(jìn)制代碼。鏈接器將main.obj中對sumint的調(diào)用與vector_utils.obj中的實(shí)現(xiàn)連接起來。優(yōu)點(diǎn)編譯防火墻修改vector_utils.cpp的實(shí)現(xiàn)只需要重新編譯這個(gè)文件所有包含其頭文件的源文件無需重新編譯。減少頭文件膨脹復(fù)雜的模板實(shí)現(xiàn)細(xì)節(jié)被隱藏在了.cpp文件中??刂茖?shí)例化范圍明確知道項(xiàng)目中生成了哪些模板實(shí)例避免隱式實(shí)例化可能帶來的意外代碼膨脹。缺點(diǎn)與限制失去泛型靈活性你只能使用預(yù)先顯式實(shí)例化好的類型如int,double,float。如果用戶想用sumlong long而你沒有提供就會(huì)產(chǎn)生鏈接錯(cuò)誤。這相當(dāng)于用“提前付費(fèi)”的有限集合換取了編譯期的效率。這適合那些類型集合已知且穩(wěn)定的場景如圖形庫中的float/double矩陣運(yùn)算。增加維護(hù)成本需要手動(dòng)管理顯式實(shí)例化列表。實(shí)操心得在大型庫的開發(fā)中常常采用混合策略。庫提供一個(gè)全泛型的頭文件版本供靈活使用同時(shí)提供一個(gè)“預(yù)編譯”版本其中包含常用類型的顯式實(shí)例化用戶可以通過鏈接不同的庫文件來選擇。例如你可以編譯一個(gè)mylib_int_double.a的靜態(tài)庫里面只包含了int和double的實(shí)例化代碼。4. 模板的顯式聲明extern template編譯加速利器如果說顯式實(shí)例化是“請?jiān)谶@里生成代碼”那么顯式聲明Explicit Declaration通常稱為extern template它的意思就是“請不要在這里生成代碼我相信它在別處已經(jīng)生成了”。extern template是C11引入的特性用于抑制隱式實(shí)例化是優(yōu)化大型項(xiàng)目編譯速度的強(qiáng)力工具。4.1 語法與工作機(jī)制語法形式如下extern template declaration;例如// 在公共頭文件 common_decls.h 中 extern template class std::vectorint; // 聲明vectorint將在別處實(shí)例化 extern template int maxint(int, int); // 聲明函數(shù)模板實(shí)例 // 在某個(gè)負(fù)責(zé)實(shí)例化的源文件 instantiate.cpp 中 #include vector template class std::vectorint; // 顯式實(shí)例化定義 template int maxint(int, int); // 在其他成千上萬個(gè)用戶源文件 user.cpp 中 #include “common_decls.h” #include vector void foo() { std::vectorint vec; // 看到extern聲明編譯器不會(huì)在此處隱式實(shí)例化vectorint的所有成員 vec.push_back(42); // 鏈接時(shí)尋找 instantiate.cpp 中生成的代碼 int m max(10, 20); // 同樣不會(huì)在此實(shí)例化maxint }工作機(jī)制聲明Declaration在頭文件中使用extern template它告訴編譯器“這個(gè)模板實(shí)例比如vectorint是一個(gè)已經(jīng)存在的實(shí)體它的定義即所有成員函數(shù)的代碼會(huì)在其他翻譯單元中提供你當(dāng)前編譯器不要在這里為它生成定義?!倍xDefinition在唯一的一個(gè)或少數(shù)幾個(gè)指定的源文件如instantiate.cpp中進(jìn)行普通的顯式實(shí)例化template class ...。這里是代碼真正生成的地方。使用Use其他所有源文件包含那個(gè)帶有extern聲明的頭文件。當(dāng)它們使用vectorint時(shí)編譯器會(huì)相信定義已存在因此跳過該實(shí)例的代碼生成步驟大大減少了編譯工作量。最終鏈接時(shí)所有對vectorint成員函數(shù)的引用都會(huì)指向instantiate.cpp中生成的那一份定義。4.2 與顯式實(shí)例化搭配使用的最佳實(shí)踐extern template和顯式實(shí)例化是一對黃金搭檔通常結(jié)合使用以實(shí)現(xiàn)最大化的編譯效率。標(biāo)準(zhǔn)庫的典型應(yīng)用 許多標(biāo)準(zhǔn)庫實(shí)現(xiàn)如libstdc, libc正是利用了這一技術(shù)。你可能在調(diào)試時(shí)發(fā)現(xiàn)#include vector后你的代碼編譯并沒有慢到無法接受這就是因?yàn)闃?biāo)準(zhǔn)庫的頭文件中包含了類似extern template class std::vectorint;的聲明而對應(yīng)的實(shí)例化代碼已經(jīng)預(yù)先編譯好在庫文件如libstdc.a中了。在自有項(xiàng)目中的實(shí)施步驟 假設(shè)你有一個(gè)廣泛使用的模板類MatrixT。創(chuàng)建實(shí)例化頭文件matrix_extern.h#pragma once #include “Matrix.h” // 聲明我們將在別處提供這些常見類型的實(shí)例化 extern template class Matrixfloat; extern template class Matrixdouble; extern template class Matrixint;創(chuàng)建實(shí)例化源文件matrix_inst.cpp#include “Matrix.h” // 在這里集中生成所有實(shí)例化的代碼 template class Matrixfloat; template class Matrixdouble; template class Matrixint;將這個(gè)文件單獨(dú)編譯成一個(gè)目標(biāo)文件matrix_inst.o或靜態(tài)庫。修改主頭文件Matrix.h的末尾可以條件性地包含matrix_extern.h或者要求用戶在使用常見類型時(shí)手動(dòng)包含它。用戶代碼// user.cpp #include “Matrix.h” #include “matrix_extern.h” // 包含extern聲明以加速編譯 void compute() { Matrixdouble mat(100, 100); // 編譯器不會(huì)在此生成Matrixdouble的成員函數(shù)代碼 mat.invert(); // 鏈接時(shí)從 matrix_inst.o 中尋找定義 }踩坑記錄使用extern template時(shí)最常見的錯(cuò)誤是“未定義的引用”undefined reference。這幾乎總是因?yàn)槟懵暶髁薳xtern template class Matrixdouble;但忘記在任何一個(gè)源文件中提供對應(yīng)的顯式實(shí)例化定義template class Matrixdouble;。你提供了定義但包含該定義的源文件matrix_inst.cpp沒有被編譯進(jìn)最終的可執(zhí)行文件或鏈接的庫中。 解決方法是仔細(xì)檢查構(gòu)建系統(tǒng)如CMakeLists.txt確保實(shí)例化源文件被正確編譯和鏈接。4.3 對編譯速度的實(shí)際影響我曾在一個(gè)人物骨骼動(dòng)畫系統(tǒng)中應(yīng)用此技術(shù)。該系統(tǒng)核心是一個(gè)模板化的BlendTreeNodeType類用于混合不同的動(dòng)畫節(jié)點(diǎn)。NodeType有大約5種常用類型。在重構(gòu)前每個(gè)用到BlendTree的.cpp文件超過50個(gè)都需要實(shí)例化這5個(gè)版本編譯耗時(shí)且obj文件巨大。重構(gòu)后編譯matrix_inst.cpp實(shí)例化文件一次耗時(shí)約30秒。其他所有用戶.cpp文件的編譯時(shí)間平均減少了60%因?yàn)榫幾g器跳過了重復(fù)的模板實(shí)例化過程。最終鏈接階段耗時(shí)基本不變??偟脑隽繕?gòu)建只改一個(gè)用戶文件時(shí)間從原來的~15秒降低到~5秒。這個(gè)收益在大型項(xiàng)目中是指數(shù)級放大的。關(guān)鍵在于你需要識(shí)別出那些被廣泛使用、且類型參數(shù)集合相對固定的模板對它們實(shí)施extern template策略。5. 綜合案例構(gòu)建一個(gè)支持多種數(shù)據(jù)源的配置讀取器讓我們把這些概念串聯(lián)起來設(shè)計(jì)一個(gè)ConfigReader類。它的核心需求是從一個(gè)存儲(chǔ)源可能是std::mapstd::string, std::string、std::unordered_map、甚至一個(gè)自定義的IniFile對象中讀取配置項(xiàng)并轉(zhuǎn)換為指定類型。我們將使用成員函數(shù)模板來實(shí)現(xiàn)泛型的get函數(shù)并使用顯式聲明/實(shí)例化來優(yōu)化其編譯。5.1 基礎(chǔ)實(shí)現(xiàn)成員函數(shù)模板的威力// ConfigReader.h #include string #include type_traits #include stdexcept class ConfigReader { private: // 一個(gè)抽象接口代表配置數(shù)據(jù)的存儲(chǔ)后端 struct StorageBackend { virtual bool has(const std::string key) const 0; virtual std::string getString(const std::string key) const 0; virtual ~StorageBackend() default; }; std::unique_ptrStorageBackend backend_; public: // 構(gòu)造函數(shù)接受具體后端的唯一指針 explicit ConfigReader(std::unique_ptrStorageBackend backend) : backend_(std::move(backend)) { if (!backend_) { throw std::invalid_argument(“Backend cannot be null”); } } // 核心成員函數(shù)模板 get templatetypename T T get(const std::string key, const T defaultValue T{}) const { if (!backend_-has(key)) { return defaultValue; } std::string strValue backend_-getString(key); return convertFromStringT(strValue); // 關(guān)鍵轉(zhuǎn)換函數(shù) } // 針對bool類型的特化版本可選展示特化能力 template bool getbool(const std::string key, const bool defaultValue) const { if (!backend_-has(key)) { return defaultValue; } std::string strValue backend_-getString(key); std::transform(strValue.begin(), strValue.end(), strValue.begin(), ::tolower); if (strValue “true” || strValue “1” || strValue “on”) return true; if (strValue “false” || strValue “0” || strValue “off”) return false; throw std::runtime_error(“Cannot convert ‘“ strValue “‘ to bool”); } private: // 私有靜態(tài)成員函數(shù)模板負(fù)責(zé)字符串到類型的轉(zhuǎn)換 templatetypename T static T convertFromString(const std::string str) { if constexpr (std::is_arithmetic_vT !std::is_same_vT, bool) { // 對于算術(shù)類型除bool使用標(biāo)準(zhǔn)庫轉(zhuǎn)換 // 注意這里簡化了錯(cuò)誤處理 if (std::is_integral_vT) { return static_castT(std::stoll(str)); } else { // 浮點(diǎn)類型 return static_castT(std::stod(str)); } } else if constexpr (std::is_same_vT, std::string) { return str; // 字符串直接返回 } else { // 對于其他類型可以在此通過SFINAE或concept引導(dǎo)用戶進(jìn)行特化 static_assert(std::is_arithmetic_vT || std::is_same_vT, std::string(), “Unsupported type for conversion. Please provide a specialization.”); return T{}; // 不會(huì)執(zhí)行到此處 } } }; // 為自定義類型提供特化例如一個(gè)簡單的二維點(diǎn) struct Point2D { int x; int y; }; // 必須在命名空間作用域內(nèi)特化 template Point2D ConfigReader::convertFromStringPoint2D(const std::string str) { // 假設(shè)字符串格式為 “x,y” size_t commaPos str.find(‘,’); if (commaPos std::string::npos) throw std::runtime_error(“Invalid Point2D format”); Point2D p; p.x std::stoi(str.substr(0, commaPos)); p.y std::stoi(str.substr(commaPos 1)); return p; }這個(gè)設(shè)計(jì)展示了成員函數(shù)模板的優(yōu)雅之處get函數(shù)本身是泛型的可以處理任何我們提供了轉(zhuǎn)換邏輯的類型T。通過convertFromString這個(gè)靜態(tài)成員函數(shù)模板我們將類型轉(zhuǎn)換的邏輯集中管理并允許用戶通過特化來擴(kuò)展支持的類型。5.2 引入顯式聲明與實(shí)例化進(jìn)行優(yōu)化現(xiàn)在假設(shè)經(jīng)過 profiling我們發(fā)現(xiàn)ConfigReader::get被用于int,double,std::string,bool這四種類型占據(jù)了99%的調(diào)用。我們可以使用extern template來優(yōu)化。// ConfigReader_opt.h (可被主頭文件包含或單獨(dú)包含) #include “ConfigReader.h” // 顯式聲明這四種類型的get函數(shù)將在別處實(shí)例化抑制當(dāng)前編譯單元的隱式實(shí)例化 extern template int ConfigReader::getint(const std::string, const int) const; extern template double ConfigReader::getdouble(const std::string, const double) const; extern template std::string ConfigReader::getstd::string(const std::string, const std::string) const; extern template bool ConfigReader::getbool(const std::string, const bool) const; // 注意bool版本我們已經(jīng)在類內(nèi)全特化了但extern聲明仍然針對這個(gè)特化版本。 // ConfigReader_inst.cpp #include “ConfigReader.h” // 顯式實(shí)例化定義在這里生成代碼 template int ConfigReader::getint(const std::string, const int) const; template double ConfigReader::getdouble(const std::string, const double) const; template std::string ConfigReader::getstd::string(const std::string, const std::string) const; template bool ConfigReader::getbool(const std::string, const bool) const; // 同時(shí)也需要實(shí)例化convertFromString因?yàn)樗莋et的依賴。 template int ConfigReader::convertFromStringint(const std::string); template double ConfigReader::convertFromStringdouble(const std::string); template std::string ConfigReader::convertFromStringstd::string(const std::string); // bool的convertFromString不會(huì)被調(diào)用因?yàn)間etbool是特化的走另一條路徑。使用方式庫的提供者編譯ConfigReader_inst.cpp并將其鏈接到庫中。庫的使用者在包含ConfigReader.h之后可以選擇性地包含ConfigReader_opt.h。如果包含了編譯器在遇到getint等調(diào)用時(shí)就不會(huì)生成代碼從而加速編譯如果不包含則回退到默認(rèn)的隱式實(shí)例化仍然可以工作只是編譯慢些且可能有多份實(shí)例。5.3 可能遇到的問題與調(diào)試技巧鏈接錯(cuò)誤“undefined reference to ...”這是使用extern template時(shí)最可能遇到的問題。首先檢查extern template聲明和template實(shí)例化定義的類型是否完全一致包括const、引用等。實(shí)例化定義所在的源文件是否被正確編譯并鏈接到了最終目標(biāo)可執(zhí)行文件或庫。可以使用nm或dumpbin工具查看目標(biāo)文件/庫的符號表確認(rèn)所需的實(shí)例化符號如_ZNK12ConfigReader3getIiEET_RKSsRKS0_這樣的修飾名是否存在?!疤鼗仨氃诿臻g作用域”錯(cuò)誤當(dāng)我們像上面為Point2D特化convertFromString時(shí)必須寫在類的外部、命名空間作用域內(nèi)不能寫在類內(nèi)部。這是C模板特化的語法規(guī)定。成員函數(shù)模板與虛函數(shù)再次強(qiáng)調(diào)成員函數(shù)模板不能是虛函數(shù)。如果你需要多態(tài)行為可以考慮使用模板方法模式Template Method Pattern在非模板的虛函數(shù)內(nèi)部調(diào)用一個(gè)模板化的輔助函數(shù)。SFINAE與C20 Concepts在更復(fù)雜的成員函數(shù)模板中你可能需要約束模板參數(shù)T。在C17及之前常用SFINAEstd::enable_if。在C20中使用Concepts會(huì)讓代碼清晰得多。例如templatetypename T requires std::constructible_fromT, std::string // 要求T可以從string構(gòu)造 T get(const std::string key) const { // ... return T(strValue); }這個(gè)ConfigReader的例子綜合運(yùn)用了成員函數(shù)模板實(shí)現(xiàn)泛型接口、全特化提供特殊處理、以及通過顯式實(shí)例化聲明來管理編譯依賴和加速編譯。它展示了一個(gè)從需求出發(fā)到設(shè)計(jì)實(shí)現(xiàn)再到性能優(yōu)化的完整思考鏈路。在實(shí)際項(xiàng)目中是否采用extern template需要權(quán)衡它帶來了編譯期的收益但也增加了接口的復(fù)雜性和對使用者的要求需要包含額外的頭文件或鏈接特定的庫。對于穩(wěn)定性高、使用頻繁的核心模板這項(xiàng)投資通常是值得的。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
亚洲第一精品在线视频| 茄子社区国产精品| 大香蕉黄色一区| 精品中文字幕第一页| 久9综合在线| 中文字幕55555| 东京热激情视频一二三区| 久久精品亚洲成a人天堂| 久久超碰国产一区二区三区| 久这精品中文在线观看视频| 久久久久久中文| 亚洲成人精品久久久| 99无码精品| 欧美日韩国内不卡| 免费观看国产小粉嫩喷水精品午| 999久久久免费精品国产牛牛| 欧美色图片欧美色图| 一区二区首页| 1024亚洲中文字幕久在线看片你懂的 | 欧美综合色综合| 亚洲AO在线| 极品色社| 999在线电影香蕉| 99久在线精品99re8热| av天堂精品久久| 久久日韩精品一区二区| 岛国片在线播放| 久96热在线观看视频| 国产精品白丝AV| 久久人人爽av亚洲精品天堂桃色| s片在线观看| 日少妇亚洲版| 97一区二区三区视频| 麻豆福利视频导航| 欧美综合加勒比在线| 久热色情精品| 亚洲色天堂九9| 亚洲色图自拍| 熟女熟妇伦久久影院毛片一区二区 | 蜜桃视频一区二区三区 | 欧美不卡五十路| 97超碰护士| 久久久久久网址| 亚洲人体视频在线观看| 天天爽夜夜爽夜夜爽精| 久久久久久精品免费看A级| 精品久久久久久中文| 人妻一区视频| 丁香色狠狠色综合久久小说| 亚洲天堂2020| 亚洲美女AV无码| 中文字幕99999| 最新av中文字幕高清| 激情 欧美 亚洲 小说| а√天堂资源官网在线资源| 国产毛片在线| 五月天偷拍| 男女打扑克高清网站| 99re3这里只有精品| 欧美黄色图片| 亚洲啪啪啪啪视香蕉| 秋霞福利网| 国产日韩中文字幕欧美| 色噜噜精品一区二区三| 99热色这里只有精品| 国产白嫩精品久久| 少妇大屁屁| 九九无码| 色999人与兽| 嗯嗯啊啊好大好爽| 色噜噜狠狠色综无码久久合欧美| 日本十八禁免费看污网站| 国产综合网站在线播放 | 欧美天堂亚洲电影院一区在线播放 | 亚洲天堂精品日韩电影| 国产一级作爱毛片| 欧美性暴力猛交XXXX | 国产多人在线观看视频| 亚洲美欧999| WWW美腿丝袜香蕉中文| 国产精品乱码久久| 少妇超碰在线| 久热网| 亚洲伊人久久综合97| 欧美日韩操操操| 欧美AB在线观看| 久久久久久免费电影| 亚洲无线观看久久| 日本在线一二| 蜜桃精品一区二区三区久在线| 少妇蹲下露出大唇5| 人人人人插| 密臀在线免费观看| 超碰在线观看av不卡| 久热无码| 91精品导航| www.伪伪| 天天综合站| 欧美一二三级精品在线| 97资源超碰| 91久久久久| 国产AV激情无码久久无码| 日韩在线女优天天干| 四虎精品永久在线观看| 91人妻素女| B049AV在线播放| 久久性爱视频免费看| 五月丁香婷婷综合| 亚洲天堂资源网| 久操精品网| 久久精品夜色国产亚洲AV| 黄色视频高清无码网站| 999久久久九| 天天视频黄| 红桃视频高潮| 日韩黄片影院| 欧美精品偷拍| 性在久久久久久| 亚洲欧美setu| A 在线网址| 亚州综合AⅤ| 日熟女| 91在线色| 国产家庭乱伦性爱视频| 伊人丝袜美腿高跟在线观看高清| 级做a爱无码性色永久免费| 肉丝网站91| 亚洲伊人成综合成人网| 伊人大香蕉在线| 亚洲欧洲成人在线电影| 国产美女激情| 午夜福利成人免费视频| 综合亚州欧美| 国产av尤物| 超碰97欧美| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 青青欧洲黑| 岛国视频一二三区| 96精品一区| 操逼网免费无码视频| 国产sv美女内射| 久久思思热| 美女裸体无遮挡永久免费观看网站| 91是天天| 国产日韩在线播放av| 欧美韩国你懂得在线 | 我中文字幕6区| 性影在线视频| 四虎884| 激情丁香五月| 亚洲成?V人片在线观看福利| 日韩情色一区二区| 伦理日韩国产久久| 大香蕉亚洲中文| 欧美性爱第一页久久| 天堂亚洲精品久久老牛| 91 亚洲 欧洲| 懂色AV蜜臀无码精品APP | 天天插天天舔舔天天干| 久久精品国产亚洲AV无码电影| 久久激情四射婷婷丁香五月天| 九九这里只有精品| 一级黄色视频网| 日比av无码| 久插综合| 丁香六月婷婷综合| 99久久e免费热视| 可免费观看的av毛片中日美韩| 欧美变态激情网| 综合色啪| 午夜福利精品| 久久久精品电影| 天天影视91看看| 欧美成不卡网| 嗯嗯啊操我| 国产麻豆一级精品视频| 午夜啪| 热久久无毒不卡| 嗯……啊…嗯嗯…啊…好舒服| 欧美性生活免费网| 免费精品无码一级毛片牛牛影视| 日本免费二区三区| 欧美日韩97在线| 麻豆AV96熟妇人妻| 中文字幕av久久爽Av| 免费观看欧美日韩操逼视频| 成人免费在线网站| 亚洲伊人a线观看视频| 综合另类| 亚洲色图91| 91痴汉| 加勒比伊人综合| 第四色色综合91| 精品人妻伦一二三区久久| 日本高清_区二区三区 | 久久久极品| av久日| 中文字幕78| 午夜精品久久久久久久99热影院| 久久女人视频| 玖玖资源中文字幕制服丝袜| 色好看av| 操美女人妻| 色婷婷蜜臀av| 欧美一区二区三区成人性生活| 中文字幕十五区| 啊操爽品善一区二区三区| 综合网,亚洲,欧美| 91精品国产综合久久久蜜臀| 九九热五区| 色91综合网| av操操不卡| 91五月天| 久久精品视| 午夜精品人妻二区三区| 台湾佬中文娱乐网久久久久久久久久com | 成人草草视频| 超碰人妻97| 试看60秒 爽| 欧美亚洲天堂| 国产无码久久高清| 亚洲乱伦图片视频| 午夜福利成人免费视频| 97超碰国产精品| 亚洲 中文 女同| 亚洲狼狼干综合1| 9999亚洲精品| 78精品| 国产无码精品无码| 中文字幕av亚洲在线| 91啪啪视频| 蜜臀久久99精品久久综合| 密臀在线免费观看| 亚洲AV在线资源| 天天射天天色成人| 高潮毛片无遮挡高清免费| 激情无码日韩| 婷婷久久五月天| 快点操死我| 伊人991| 嗯嗯不要 视频| 国产午夜精品理论片a大结局| 亚洲一区日韩精品中文字幕| 国模少妇一区二区三区| 亚洲伊人久久精品狠狠在线| 91劲爆| 亚洲一区二区AV| 操操操五月天婷婷丁香影院| 蜜臀操逼黄色视频操的好爽| 伊人大香蕉在线| 欧美性生活内射| 日本三级一区二区 在线| 自拍大香蕉乱插| 91n美女视频| julia ann久久| 免费成人自拍视频在线| 翔田千里av一区二区三区| 国产精品一区二区在钱播放| 久久亚洲日韩国产欧| 欧美高清18A片| 国产精品视频精品一二| 久草色悠悠在线视频| 男人天堂导航| 99精品久久久久久久婷婷蜜桃| 日本丝袜美腿人妻九九| 大香蕉中文网| 国产成人免费观看在线视频| 亚洲有码第一页| 资源新线在线天堂| 熟女乱伦二区| 天操天操夜操夜月月年年操操| 国产精品香蕉| AA丁香综合激情| 天天综合站| 人人人人插| 亚洲色图a| 97啪啪| 天天干美少妇一区| 大香久久| 人人爽天天爽| 精品三级在线专区| 丁香五月天婷婷姐| 91久久免费视频互動交流| 一区二区三区在线资源| 亚欧美色| 欧美.亚洲.另类.丝袜.制服.诱惑| 亚洲 综合 第一页| 久久久久亚洲?V片无码V| 夜夜狠狠躁日日躁色视频| 狠狠干91| 密臀在线免费观看| 久久国产AⅤ| 亚洲国产欧美日韩人妻日中文| 白嫩白嫩的午夜九久久久久久久久久久久成人剧场 | 精品78| 久久色人体| 男人的天堂va在线| 超碰吊日色| 男女激情黄色网址| 亚洲se电影| 久久久成人国产精品无码| 国产精品久久久久久9999| 久久五十路熟女人妻| 中文字幕女同在线| 老司机射| 玖玖久久久| 国产天美欧美| 欧美一级AAAAAAA| 久久夜夜夜夜| 久久久久成人亚洲国产| 日日躁夜夜躁狠狠躁超爽| 国产这里只有精品| 国产中文字幕在线点播| 亚洲蜜臀视频精品久久| 十八禁啪啦拍视频无遮挡| 日韩无码人妻中字久久三区四区| 在线综合 亚洲 欧美中文字幕| 久热影视| 日韩有码中文字幕女同性恋 | 淫纸中9区| 黄污污污污| 一级性爱视频免费观看| 亚洲AV在线资源| 性爱av网站| 婷婷爽人人婷婷爽视频| 区一二区日韩亚洲乱码av电影| 亚洲精品国产熟女久久久久久| 国产丸一视频| 69人妻人人揉人人躁人人精品| 97色伦97色伦国产欧美| 免费国产| 日本加靬比网站发布页| 日韩无码专区| 日韩精品在线观看观看| 久久国产精品m码| 1234区中文字幕在线观看_青青草国产在线_日韩一区二区 | 亚洲欧洲久久天堂| 二色av| 懂色中文一区二区三区 | 成人无码在线视频网站| 超碰精品97| 国产盗摄美女如厕大神作品在线观看 | 91精品国产综合久久久蜜臀| 欧美精品1区2区3区| 97超碰色| 日本免费二区三区| 九区国产| 亚洲精品一区二区免费在线观看| 中文字幕视频2区| 国产精品久久久鸭无码的功能| 久久久久久久强迫| 丝袜AV一区二区三区| 北条麻妃性愛视频| 久久999久| 骚逼高潮久久精品| 亚洲精品三| 无码 黑人一区二区三区| 香蕉99秘 一区精品蜜桃臀| 97在线观视频免费观看| www.狠狠干.coom| wwwcaobibi| 东京热视频网| 成年人黄色视频免费| 亚洲女人91| 老鸭窝在线视频播放| 久久m| 欧美熟女妇同| 污污污8888| 久久av色| 97超视频在线观看| 亚州中文字幕超碰97| 后入人妻一区| 亚洲情色图片区| JULIA人妻风俗店中出电影| 伊人久久88国产女| 日本一区二区电影网站| 国产高清1234区| 国产嫩草精品A88AV| 欧美综合 站| 青青草无码视频| 久偷拍欧美日韩三区| 九X超碰| 亚洲色图欧美色图制服丝袜| 嗯……啊…嗯嗯…啊…好舒服| 美女露胸露奶头| 国色天香av| 蜜臀精品1区2区| 99中出在线| 九九热免费国产视频婷婷伊人五月| 水野优香在线观看| 超碰 97国产熟女| 日韩情色视频| 欧美日韩精品国产91| 四虎884a| 黑人精品欧美一区二区蜜桃| 人妻精品一区二区| 亚洲成人激情小说视频| 国产黄色小视频网站| 91丨九色丨国产丨人妻在线 | 亚洲九九夜夜| 黄页18禁| 欧美韩日精品资源| 欧美色网络| 色综合一本| 亚洲AV秘 精品久久老牛影视| 欧美日韩国产三级黄色| 国产精品自产拍在线观看社区| 9999久久久久| 性性欧美| 丰满人妻一区二区三区免费| 青娱乐休闲视频在线观看| 999久久久免费精品国产牛牛| 日本成人A片免费看| 人人摸人人叼| 亚洲一二三四区机械| 97超碰人操| 久久久久久久| 免费无码国产精品v片在线观看| 97超碰总站| 久热91| 久久久久久波多野吉衣高潮| 国产欧美亚洲精品a第2页| 97伊人超碰| 夜夜精品视频| 五月天婷婷综合| 久久系列| 久久久久国产精品片区无码直播 | 人妻免费观看| 最近2018中文字幕在线高清第一页| 国产福利精品最新在线| 日韩少妇丰满亚洲| 97综合在线| 久插综合| 美女主播色欲91抠b在线播放| 久久久夜夜夜| 日韩成人高清一区二区| 亚洲美女AV无码| 丰满人妻一区二区三区色-百度| 色y情视频免费看| 激情小说五月天| 青青伊人久久| 亚洲码在线中文在线观看| www网站黄| 久久精品老司| 老熟女网站| 亚洲一卡2卡3卡4卡乱码网站 | 国产日韩欧美操逼视频 | 中文字幕一区二区三区人妻不卡| 天天色天天干天天爱| 素人播放一区| 91国产丝袜白虎| 日韩亚洲中文字幕在线| 亚洲综合性感在线| 手机看片91人妻| 99免费视频| 精品无人区麻豆乱码1区2区图片| 成人a大片在线观看| 色诱avtt| AV一起草在线| 亚洲图片欧美制度| 翔田千里爆乳巨臀无码| 熟妇色99| 91 亚洲 欧洲| 3PAV乱伦视频| 欧美78p| 日韩啪啪视频| 高清不卡国产| 女性喷水高潮在线观看| 丰满少妇人妻久久久久久| 久九色| 99re这里只有精品中心播放| av激情亚洲五月天| 美女淫穴| 精品视频97| 欧美日韩人人精品| 91草草草| 亚洲se电影| 中文一区在线视频| 九草九九九| 亚洲AV无码国产成人| 操死我了啊啊啊| 91精品无码人妻系列| 色偷偷综合91久久噜噜| 久热九九| 91美女视频| 97香蕉人人乳| 乱伦系列一区二区| 男人天堂资源| 无码人妻丰满熟妇奶水区毛片| 国产丝袜美女在线一区| 国产超碰欧美| 中文字幕一区 二区三四五 区日 日骚 | 麻豆黄四叶草网站| 久久成人国产| 亚洲人妻日日日| 国产精品经典一卡久久久 | 色综合久久888| 久久69| 亚洲中文字幕日产无码久久| 家庭乱伦网站国产| 蜜臀久久久99久久久久 | 激情综合五月| 九九九精品成人免费视频小说| 美腿丝袜偷拍亚洲欧美| 亚洲精品日韩国产欧美| 无码不卡亚洲成?人片| 97国产天堂岛| 丝袜美腿诱惑亚洲欧美视频在线观看| 无遮挡又黄又刺激的视频| 欧美日韩人妻少妇 一区二区三区| 亚洲欧美日韩综合在线尤物 | 青青草吊丝| 国产懂色精品国产av| 国产捆绑一区| 亚洲97资源| 区一二区日韩亚洲乱码av电影| 欧美黑人精品一区二区| 久久精品一区二区一8| 国产精品久久久久久久久久二区三区| 中文字幕二区日韩天堂| 亚洲综合精品国产一区| 欧美精品23| 春色综合网| 欧美色图 人妻| 麻豆久久视频在线地址| 99久在线精品99re8热| 午夜福利激情在线视频| 九九九免费视频| 四季av一区二区凹凸精品小说| 久久最新视频免费观看| 亚洲夜色在线| 亚洲成av人片色午夜乱码| 另类TS人妖一区二区三区| 伊香蕉综合久久久久久久噜噜噜| 熟妇国产免费一区| 欧美A√综合网 | 色九九九综合| 少妇天堂网络| 夜夜狼人妻| 口爆综合网| 丰满的三级少妇欧美久久久| 一级黄色性爱A级片| 久操操AV电影| 久久中文字幕不卡人妻| 欧洲在线性爱视频| 91综合色噜噜| www国产无码| 亚洲婷婷丁香在线| 亚洲欧美日韩偷拍色图| 91欧美综合| 怡红院成人视频| 日本一二三免费久久| 校园春色欧美| 亚洲色图8| 欧美97免费| 青娱乐 青青青操 日逼| 日日97| 久久久青青草| 人妻欧美| 国产乱伦搜索结果91P| 国产成人欧美精品在线| 国产亚洲精品A在线观看下载| 黄色免费一级在线毛片| 亚洲日韩在线a不卡99精品| 91福利网在线观看| 午夜精品久久久久久久久久蜜桃| 丁香六月激情| 牛黄色久午久| 极品色社| 91热情品| 亚洲影视第一页| 欧洲色综合| 蜜桃久久一区二区| 老子午夜伦不卡影院| 操逼视频色| 囯产乱伦一区二区三女| www.色五月| 国产久久久9999| 日本欧美色| 青青草影视蜜久久| 国产精品白领在线观看| 国产精品69人妻无码久久久| 精品少妇一区二区三区在线视频| 丁香五月成人| 啊啊啊啊操死我了| 欧美色图欧美| 国模私拍一区二区三区神乳| 人人操人人摸人| 一区二区激情国产熟女 | 伊人网青青| 日本123区操B视频| 欧美成人精品一区二区三区| 五月天亚洲网| 亚洲乱码精品一区二区| 中国一区二区亚洲人妻| 亚洲色图激情小说| 超碰视97中文| 秋霞一级鲁丝片A片| 成人日本视频人妻在线| 日本不卡码黄色| 熟女熟妇一区二区三区视频| 国产精品久久久久久亚洲色欲| 色综合av男人天堂| JULIA人妻风俗店中出电影| 成人精品水蜜桃久久久久久久| 亚洲日韩国产精品| 国产亚洲禁久一区二区| 日韩在线人妻网站| 果冻传媒A片麻豆熟妇人妻| 国产女同视频在线播放| 青青草日本无码| 伊人久久亚洲色欲综合网站 | 日韩人妻少妇 一区二区三区| 九九九九九九九九九五码| www欧美91| 成人 日本A片无码8888| 91骚妇| 一区二区三| 人人扣人人操| 视频黄站| 影音先锋视频在线| 国产超碰在线一区| a级免费在线观看| 久99| 大逼色网站| 亚洲午夜福利在线影院| 青青草成人视频在线观看二区| 青青色在线观看| www狠狠| 欧亚日本情色| 国产精品一二三在线看| 精品乱码久久久久| 美女熟妇色| 亚洲欧美九九九| 日本不卡一区二区| 神马精品视频| 欧美加勒比| 色爱综合网| 97美日韩视频| 大香樵伊人网| 久久东京热久久| 日韩三级一区 | 精品久久99| 一起草高清无码| 青青草日本无码| 欧美天天综合网| 久久黄黄| 亚洲人成网站7777| 中国黑人三级片网站上区| 免费人成毛片乱码| 久久成年精品| 精品人妻中文字幕4399| 91亚洲丝袜| 日美免费黄片| 9精品久久久久| 裸体美女免费看网站青草| 国产女人视频三四五区| 久久久啊啊| 伊人网青青| 日韩色女精品| 婷婷丁香五月激情啪啪| 超碰美女97| 成人网欧美风情| 成人a大片在线观看| 久久视频,这里只有精品| 亚洲欧洲国产综合av| 欧美成人精品一区| 在线女人91| 欧美亚洲色图另类国产| 天天干人妻视频| 性色一线| 狠狠操夜夜| 清纯唯美第一页| 久久久精久久久| 91社操逼| 人妻精品一区二区| 啊啊啊啊二区好大| 色人久久| 永久免费av无码网站国产app| #NAME?| 黑丝少妇| 综合久久六月久久婷婷| 夜夜精品视频| 欧美色图 人妻| 九九av| 国产精品成人久久一区二区三区| 啊啊啊啊,啊啊好多水| 久久久精品国产亚洲伊人| 性色生活片久久毛片婬片免费放女人一级毛片 | 啊啊啊啊二区好大| 色色色综合网| 亚洲91在线播放影院| 東南亚性呦成人伦理资源在线视频| 天天精品| 操穴国产| 夜夜欢天天干| 亚洲图片欧美在线视频| 欧美天天影院| 神马久久久久眼| 日本色色色视频| 欧美激色| 亚洲情色一区三区| 97av,com| 手机看片1025| 亚州男人天堂| 日韩天堂av电影在线观看| 91在线精品| 亚洲色丰满少妇高潮| 无码99| 日韩欧美综合激情| 热思思免费视频| 一区二区三区麻豆| 四虎免费视频| 亚洲日产专区婷婷| 美女淫穴| 欧美亚洲国产自久久| 99激情视频| 天堂8在线新版官网| 九九综合久久中文字幕| 日韩强奸av| 97干97色| 9久久精品| 97在线/亚洲| 国产九九九九九九| 久久AV色| 亚洲天堂日本| 亚洲AV不卡在线观看尤物| 亚洲青青青视频在线| 丁香五月婷婷色| 国产 三级自拍| 国产综合永久精品日韩鬼片| 日本狂喷奶水在线播放212| 中文字幕日韩专区精品系列| 12一15性XXXX粉嫩国产| 亚洲色图亚洲| 操逼A∨| 一区二区三区美女超清| 亚洲精品国产精品成人| 国产成人91一区二区三区| 人妻精品视频一区二区三区| 少妇一级无码精品| 亚洲无线码欧洲精品区别| 国产丝袜美女在线一区| 日韩精品色呦呦| 都市久久精品激情亚洲| 免费黄色片。| 亚洲精品天堂久久A∨51成人漫| 中文字幕,人妻,日韩| 操操吧亚洲乱伦视频| ..日韩av毛片精品久久久| 操操逼操操逼操操逼逼| 成年人一级黄色毛片大全在线观看| 黄色AAAAAAAAAAA大片| 老司机深夜影院18未满| 丁香九月激情啪| 一区二区激情国产熟女| 岛国小电影| 熟妇人妻一区二区三在线| 精彩久久中文| 丝袜足交视频| 亚洲av无码国产精品字幕| 香蕉久久AⅤ...| 1769精品一区二区三区| 久久久爆乳翘臀一线天伦理视频| www鬼畜国产男人的天堂| 五月天久久婷婷亚洲| 天天拍天| 成人怡红院| 99老司机精品视频在线观看| 久精品无码av一区二免费国产在线观看| 一区二区娱乐网站| 爱干爱射网啊啊啊| 亚洲丝袜制服国产91_国语字幕免费观看完整版下载第5集_ | 久久夜色一区二区| 国产精品九九| 欧美狠狠| 午夜精品探花| 一二三啪啪专区| 97超色| 精品无码秘 人妻一区二区| 国产免a费看黄片在线| 亚洲免费看片| 亚州中文字幕超碰97| 风韵犹存大大大大香蕉| 自怕偷自怕亚洲精品| 亚洲日本韩国在线| 久久九七| 欧美啪啪色吧在线| 国产精品色片一区二区| 屌逼麻豆| 婷婷精品国产欧美精品亚洲人人爽| 一本色道人妻久久| 精品中文字幕一区二区| 91操操| 亚洲宗合网| 亚洲91在线| 在线性黄高清免费视频| 日本一区二区电影网站| 欧美在线大香999| 欧美精品99久久久**| 97青青操视频| 中文字幕黄色一起草| 在线a v| 中文字幕在线观看网页| 91美女视频直播| 欧美日韩操逼嗦吊| 肉嘟嘟www视频在线观看高清| 2025亚洲男人天堂| 91精品国产91久久福利| 亚洲综合99999| 男女激情黄色网址| 白丝被操91| 玖玖超碰熟| 人人看黄色视频| 另类小说五月天| 欧洲自拍第一页| 国内毛片婷婷六月色| 影音综合网| 久久9久| 亚洲色天堂日韩中| 91精品久久久久| 欧美性爱另类综合| 本道在线| 99久久精品国产高潮| 成人精品欧洲亚洲| 日本午夜操逼| 欧美超碰人妻97| 色噜噜精品一区二区三| 九九热精彩视频| 成人性爱av.com| 男人的天堂2000| 69少妇一区二区| www.91欧美| 国产欧美成人第一页在线观看| 国产精品午夜成人福利| 日韩欧美操逼xxx| 丝袜天堂| 乱伦图一区| 欧洲精品欧洲精品| 久久一区二区三区入口| 精品久操| 99热精品在线在线| 亚洲超碰97| 麻豆国产av网| 午夜超爽| 久久久久久裸体| 国模精品娜娜一二三区| 天天色综合影视网| 欧美少妇熟女| 一区二区免费电影久久| 美性中文综合网| Blackedraw视频一区二区| 亚洲欧美内射| 91麻豆天美国产欧美| 国产偷拍网站| 粉嫩AV输入| 亚洲啪啪性视频| 97视频免费在线观看| 日欧美色| 久久无码电影| 成人国产二区三区在线,男女精品。| 欧美毛片在线网| 黄色大片免费在线| 亚洲AV在线资源| 美女刺激久久国产欧美| 亚洲A曰本VA欧美VA视频| 一区二区三区色综合| 国产自偷自拍一区| 国产区日韩区在线观看| 亚洲天堂日本| 99re在线观看| 91精品黄在线观看| 91男同| 天天色怡春院| 色与欲影视| 综合97| 久久精品天美| 亚洲AV无码国产成人| 人妻丝袜一区二区三区在线| 操人妻逼91| 少妇滛荡视频| 国产日韩手机视频在线| 超碰碰小说97| 熟妇女人妻呻吟久久AV| 美女极品一区二区三区| 亚洲熟女av中文字幕| 密臀视频一区二区三区| 丁香六月天| 日韩亚洲中文字幕在线| 天堂性色| 97视频在线免费播放| 美女露胸露奶头| 7777欧美成是人在线观看| 欧美亚洲自拍另类人妻| 日本在线15p| 美国久久一二三四| 人妻嗯啊啊在线播放| 中日韩久久久| 男女日B国产| 精品视频一二三中文| 插入粉嫩少妇视频| 精品无吗久久| 婷婷五月影院| 亚洲午夜福利视频| 亚洲国产精品9999在线观看| 天天躁日日躁狠狠躁| 亚洲综合色图欧美| 狠操91,com| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 国产精品对白自产拍| 97精品久久久久久久| 日韩另类色图| 久久婷婷五月综合| 免费看欧美美女黄色大片| 三级激情网站| yaouchengrenav| 欧美色女人| 国产免费内射视频| 国产乱码久久久| 亚洲国产成人7777| 天天亚洲| 久久蜜桃一区二区| 欧美黑人日韩少妇色情| 国产又大又粗又色生活片亚洲国产精品成人久久久综合免费 | 蜜桃午夜视频一区二区| 日韩精品 资源| 国产99热| 欧美操逼视频二区| 自拍丝袜美腿人妻| 亚洲中文字幕妇伦久久| 你操综合| 99re6久热只有精品6在线直播| 色婷婷视频| 九九热超碰| 亚洲色图久久精品蜜| 九九综合| 水澄无码AV| 日本一级婬片试看三分钟| 10000部十八禁看电影| 国产99久久99热这里只有精品15| 久草免费福利在线播放| 日本操色导航| 伊人网综合在线视频| 隔壁邻居波多野结衣中文字幕 | 美女黄频a美女大全免费皮| 免费作爱一级视频| 中文自拍欧美影视| 狠狠综合网| 欧美图片偷拍| 日本精品88888888| 伊人久久大香线综合无码| 色色综合97| 无卡一区=区| 999国产精品999久久久久久| 久久久久久性爱免费视频| 欧亚日韩一区在线| 欧美三四五区| 日韩图区| 亚洲有薄码区日本系列中文字幕| 久啪视频| 超碰午夜| 亚洲熟女乱综合一区二区三区| 日韩无码服务区| 激情情色五月天| 亚洲中文电影| 色香伊人| 一级AV性爱| 黄色片一区二区三区四区五区| 亚洲欧美日韩二区视频| 亚洲黄色网址视频| 色吧五月| 国产久久视频| 风月影院男女十八禁| 91男人综合| 欧美第一页| 黄在线| 久久丁香五月婷婷| 97超碰无码网| 日韩干B| 国产综合日韩伦理| 熟妇艹鸡八| 亚拍在线| 亚洲精品99999| 人人操人人摸人人看人人干| 激情AV| 少妇69中文| 四虎在线视频| 岛国激情视频在线观看| 国产精品一区二区黄片| 国产a级精品| 96国产精品| 亚洲aV性爱| 久操九九九九九九九九九九九九九九九九九九九九九九九九九九九九 | 亚洲日韩97| 成人羞羞视频国产| 亚洲四虎熟女精品| 九九热超碰97亚洲最新香蕉 | 欧美日韩国内不卡| 国产农村妇女精品1区二区| 精品人妻一区二区蜜桃视频| 中文操逼字幕| 67194国产| 色在线69堂| 天天射天天| 中出91| 亚洲激情欧美色图 | 久久av色| 国产400孕妇孕交群| 亚洲强奸乱伦影视网| 97色论| 亚洲无线观看久久| 激情综合五月丁香| 亚洲 综合 第一页| 国产三级资源在线观看| 神马精品视频| 97久久超碰日韩精品| 婷婷丁香五月天亚洲天堂网| 日本精品国产视频| 一区二区三区国产在线播放 | 麻豆一区二区AV天美| 久操网视频| 久久久18禁| 日韩欧美亚欧在线视频| 日本人体九九九九九九| 精品美女少妇一区二区| 亚洲中文一区二区三区视频| 国产一区二区久久| 一本久道在线综合视频| 香蕉一区二区三区在线视频| 午夜爽爽爽| 亚洲欧美精品一区天堂久久 | 97精品熟女少妇一区| 人妻爽爽啪视频| 黄片国产精品一区二区| 岛国人妻少妇av在线观看| 操b在线观看| 国产精品午夜成人福利| 国产亚洲深夜激情| 9久久美女首页| 亚洲 欧美 偷拍 唯美| 91少妇香蕉久久精品| 国产专区第一页| 欧美激色| 亚欧性爱在线无码| 亚洲Av诱惑| 老色69| 国产无码三级视频在线观看| 97色97好| 欧美日韩国产黄色片| 亚洲熟妇综合久久久久久| 精品中文字幕一区二区l - 百度| 台湾佬中文娱乐网久久久久久久久久com | 91碰超| 日韩精彩视频| 狠狠综合| 色色毛片| 18禁久极品美女久久哦哟呀!| 精品免费1| 天天插夜夜操| 少妇久久久免费| 成人精品在线观看| 人人爱人人乐人人操| av一区二区三区四区五区久草臀| 特级毛片特黄久久免费看| 久啪视频| 丝袜制服字幕在线| 十八岁啪啪视频免费看| 亚洲成人帖图| 亚洲中文字幕妇伦久久| www.伪伪| 国产区在线| 大香蕉在线86| 欧美疯狂做爰xxxx| 综合久久少妇中文字幕| 97bbn| 激情综合网激情五月天| 天堂v无码免费视频| www. 男人天堂成人在线| 成人欧美一区二区三区黑人一| 日韩综合无码一区久久92| 超碰午夜| 丰满欧美少妇| 浪人综合网| 综合网亚洲| 五月天亚洲网| 亚洲乱色视频一区、二区在线| 在线观看色视频| 欧美天天综合网| 毛片麻豆91糖心精品毛情片| 精品女人999| 免费A V在线播放| 91久久青青草原精品| 91久久国外网| 久久久久久久久久久久久久久乱码| 2021久久国产综合精品青草 | 日产国产精品中文久久婷婷| 婷婷中文网| 日日干天天干夜夜爽| 亚洲国产97在线精品一区| 欧美 综合| 日韩有码免费视频| 国产99久久99热这里只有精品15 | 五月香婷婷| www.大香| 丁香五六月啪啪| 97亚洲中文| 亚洲色综网| 精品一国2| 黑人中出21连凳花野真衣| 99re视频在线观看这里只有精品| 日韩国产乱子伦App| 日韩黄片影院| 亚洲天堂男人天堂网| 啊啊啊啊在线播放| 欧美亚洲美少妇一区二区| 天美av在线观看| 天天干天天做| 久久露脸国产老熟女| 人人插人人摸人人| 日韩欧美大力操| 熟女91网| www网站黄| 97超碰色中文字幕| 日韩欧美大力操| 久/久精品99看9| 97久久久久久久久久| 国产AV人人 夜夜人人澡| 欧美制服另类丝袜| 天天做天天爽| 久久伊人大香蕉| www.av在线观看| 久久久久久精品免费看A级| 免费啪啪av| 无码 黑人一区二区三区| 大香蕉乱级| 日本孕妇一区二区视频操逼免费看 | 91久热| chaopen97久久| 精久久久| 欧美亚洲色的图| 精品人妻视频一区二区在线播放 | 亚洲欧美97| 美女性91| 日本天天干天天操一区| 婷婷色香伊人| 国产内射爽爽大片| 91免费看一区二区三区| 国产无码精品久久久久久| 精品无码久久久久久久杏吧| 99久久无码| 秋霞一级A片黄色视频| 不卡av在线中文字幕| 性色生活片久久毛片婬片免费放女人一级毛片| 日婷婷| 色网在线视频观看免费| 国产aⅴ无码片毛片一级网站| 亚州男人的天堂| 激情天天视频| 精品九九国产无码| 国产精品美女久久久久久网站|