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

ARTICLE DETAIL

資訊詳情

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

C++類模板從入門到工程實(shí)踐:實(shí)例化、特化與常見陷阱

C++類模板從入門到工程實(shí)踐:實(shí)例化、特化與常見陷阱 學(xué) C 的人幾乎沒有不碰類模板template的。STL 容器、智能指針、標(biāo)準(zhǔn)庫算法隨便拉一個(gè)出來都是類模板或函數(shù)模板的產(chǎn)物。但我發(fā)現(xiàn)一個(gè)現(xiàn)象很多人能看懂 vector 、unique_ptr 的用法一轉(zhuǎn)身要自己定義一個(gè)類模板就開始手足無措要么把 template 關(guān)鍵字到處亂放要么干脆不知道成員函數(shù)該怎么寫在類外面。這篇文章我想把 C 類模板從語法骨架到工程實(shí)踐捋一遍重點(diǎn)不是背書而是回答“為什么這樣寫”“為什么我自己寫的時(shí)候會(huì)編譯失敗”以及“什么樣的代碼風(fēng)格能讓模板類長期可維護(hù)”。無論你是剛學(xué)完類和對(duì)象、第一次看到 template 的初學(xué)者還是寫過一陣子模板卻總是被編譯錯(cuò)誤折騰的開發(fā)者都值得花十幾分鐘從頭過一遍。1. 類模板要解決的最原始痛點(diǎn)為類型寫同一份實(shí)現(xiàn)1.1 沒有模板時(shí)代復(fù)制粘貼帶來的是長期的維護(hù)負(fù)債想象一下你要寫一個(gè)整數(shù)棧、一個(gè)字符串棧、一個(gè)浮點(diǎn)數(shù)棧。不用模板最直接的做法是復(fù)制三份類改成不同的類型名。類體可能七八十行復(fù)制三份之后看起來也還好對(duì)吧可問題出在改需求的時(shí)候。比如某一天你想給棧加一個(gè)clear()方法或者想把底層存儲(chǔ)從std::vector換掉你就得同步修改三份代碼少改一份某條業(yè)務(wù)分支就會(huì)在運(yùn)行時(shí)崩潰或者行為不一致。再往后添新類型又得復(fù)制第四份、第五份。這就是典型的“復(fù)制粘貼式開發(fā)”的長期維護(hù)負(fù)債。短時(shí)間內(nèi)爽后續(xù)每次改動(dòng)都在還債。類模板的思路本質(zhì)上很樸素既然這三份類的差別只在于元素類型那我把“類型”這個(gè)詞挖掉留一個(gè)占位符出來。寫一次邏輯讓編譯器在遇到Stackint、Stackstd::string、Stackdouble的時(shí)候分別按你說的類型再去生成對(duì)應(yīng)版本。這個(gè)概念就是“用同一份代碼模板描述一類對(duì)象”也就是類模板的核心價(jià)值。1.2 類模板的思路把“類型”本身變成參數(shù)普通函數(shù)的參數(shù)是變量傳入的是值。類模板的參數(shù)是類型或者稍后會(huì)提到的編譯期常量。你可以把模板理解成給編譯器的一張圖紙templatetypename T class Stack { // 凡是元素類型都用 T 占位 };當(dāng)你寫下Stackint的時(shí)候編譯器拿到這張圖紙把里面所有T替換成int生成一套真正可以實(shí)例化的類。當(dāng)你寫下StackMyUser的時(shí)候再替換一次生成另一套獨(dú)立的類。這跟 C 語言里宏展開的思想有點(diǎn)像但區(qū)別在于模板有嚴(yán)格的語法和類型檢查不是無腦文本替換。關(guān)鍵詞typename和class在這里可以互換老代碼里更常見寫class新代碼大家逐漸習(xí)慣用typename含義完全一致。至于參數(shù)名叫T也不是強(qiáng)制規(guī)定只是慣例你叫ElemType、ValueType都行只要在模板體里保持一致。1.3 順帶澄清類模板和模板類不是同一個(gè)名詞初學(xué)者問“類模板和模板類有什么區(qū)別”的頻率非常高。簡單說類模板是那個(gè)帶templatetypename T的類定義本身它是一種“圖紙”模板類指的是“已經(jīng)指定了具體類型參數(shù)的類”比如Stackint此時(shí)可以說是一個(gè)模板類實(shí)例。這個(gè)區(qū)分在口語里經(jīng)?;煊玫珜懳恼?、做設(shè)計(jì)時(shí)搞清楚有助于溝通。真正重要的是類模板本身不是一個(gè)可用的類型你沒法聲明Stack s;必須給出類型參數(shù)得到實(shí)際類型后才能創(chuàng)建對(duì)象。2. 一步步寫一個(gè) Stack 從定義到實(shí)例化的完整骨架2.1 類內(nèi)實(shí)現(xiàn)版本最直觀的第一版先看一段完整的StackT類內(nèi)實(shí)現(xiàn)。作為示例我直接依賴std::vectorT做底層存儲(chǔ)這樣聚焦在模板語法上而不是數(shù)據(jù)結(jié)構(gòu)細(xì)節(jié)。#include vector #include stdexcept templatetypename T class Stack { public: void push(const T value) { data_.push_back(value); } void pop() { if (data_.empty()) { throw std::out_of_range(Stack::pop(): empty stack); } data_.pop_back(); } T top() { if (data_.empty()) { throw std::out_of_range(Stack::top(): empty stack); } return data_.back(); } bool empty() const { return data_.empty(); } size_t size() const { return data_.size(); } private: std::vectorT data_; };注意std::vectorT里的T。當(dāng)T是int時(shí)成員變量就是std::vectorint當(dāng)T是自定義類型Product時(shí)成員變量就是std::vectorProduct。模板參數(shù)一旦傳入編譯器會(huì)沿整個(gè)類定義把所有出現(xiàn)T的地方都替換掉包括普通函數(shù)參數(shù)、返回值、局部變量和成員變量聲明。使用方式很直接Stackint intStack; intStack.push(1); Stackstd::string strStack; strStack.push(hello);這里有個(gè)容易誤解的地方Stackint和Stackstd::string是兩個(gè)完全無關(guān)的類型它們之間沒有繼承、也沒有隱式轉(zhuǎn)換關(guān)系。你寫一個(gè)普通函數(shù)void foo(Stackint)傳Stackstd::string進(jìn)去編譯器會(huì)直接報(bào)類型不匹配因?yàn)榫幾g器確實(shí)生成了兩套獨(dú)立的類。2.2 成員函數(shù)在類外定義時(shí)的重復(fù)寫法實(shí)際項(xiàng)目里為了讓類的接口更清晰、降低編譯期依賴經(jīng)常把聲明和定義分開。普通類在類外定義成員函數(shù)時(shí)只需要寫ClassName::functionName。模板類就不一樣每個(gè)類外定義的成員函數(shù)都必須重新帶上templatetypename T同時(shí)要寫StackT::。templatetypename T void StackT::push(const T value) { data_.push_back(value); } templatetypename T void StackT::pop() { if (data_.empty()) { throw std::out_of_range(Stack::pop(): empty stack); } data_.pop_back(); } templatetypename T T StackT::top() { if (data_.empty()) { throw std::out_of_range(Stack::top(): empty stack); } return data_.back(); }在頭文件里這樣寫的時(shí)候templatetypename T這行聲明必須緊跟對(duì)應(yīng)定義。有人會(huì)把templatetypename T寫漏或者寫成了templatetypename T但函數(shù)名卻寫Stack而不是StackT編譯器就會(huì)報(bào)類似“缺少模板實(shí)參”的錯(cuò)。還有一個(gè)容易忽略的點(diǎn)普通類可以一個(gè)::走天下模板類在嵌套作用域里更要小心比如構(gòu)造函數(shù)寫在類外templatetypename T StackT::Stack() default;在 C11 之后即便想 default不在類內(nèi)寫也要把這個(gè)聲明放在類里類外才補(bǔ)定義。如果干脆不寫任何構(gòu)造編譯器生成默認(rèn)構(gòu)造你也不需要額外操心。2.3 交給編譯器的“實(shí)例化”到底發(fā)生在什么時(shí)候很多初學(xué)者背下了模板語法卻搞不明白模板代碼什么時(shí)候被真正編譯。實(shí)際上模板定義里的語法錯(cuò)誤在編譯器看到templatetypename T class Stack {...}時(shí)就會(huì)檢查一部分但和類型相關(guān)的邏輯錯(cuò)誤往往要等到你寫出Stackint這樣的實(shí)例化表達(dá)式之后編譯器才會(huì)把T替換成int再全量檢查一遍成員函數(shù)體。這就是為什么有人寫了一個(gè)模板類從來沒使用過它編譯通過了一旦真用起來報(bào)了一堆錯(cuò)。真實(shí)原因是你沒有實(shí)例化它編譯器沒必要去檢查“把T替換為某個(gè)類型后函數(shù)體里的所有操作是否合法”。只要T是未知的很多操作沒法提前判定。這個(gè)機(jī)制既方便又危險(xiǎn)方便在于模板代碼可以寫得很通用危險(xiǎn)在于如果你只用某一套類型實(shí)例化另一條函數(shù)分支可能從來沒被檢查過等線上某個(gè)怪異的類型觸發(fā)時(shí)才炸。2.4 構(gòu)造函數(shù)的模板參數(shù)推導(dǎo)C17 帶來的改變?cè)?C17 之前寫Stack這類模板你必須顯式給出類型參數(shù)Stackint s;哪怕構(gòu)造函數(shù)里已經(jīng)傳了int進(jìn)去編譯器也不會(huì)替你猜。C17 引入了類模板實(shí)參推導(dǎo)CTAD一部分場(chǎng)景下可以直接簡寫templatetypename T class AutoStack { public: AutoStack(T seed) : data_{seed} {} private: std::vectorT data_; }; AutoStack s{42}; // C17 推導(dǎo)出 AutoStackint這對(duì)減少冗余非常有幫助但推導(dǎo)也不是永遠(yuǎn)符合直覺。構(gòu)造函數(shù)有多個(gè)參數(shù)、參數(shù)類型不完全一致、或者有默認(rèn)構(gòu)造時(shí)推導(dǎo)規(guī)則會(huì)變復(fù)雜。后面第 6 部分我再單獨(dú)展開。3. 非類型參數(shù)、默認(rèn)參數(shù)和特化類模板不止能傳類型3.1 非類型模板參數(shù)把一個(gè)編譯期常量傳給類類型可以作為模板參數(shù)整數(shù)、枚舉、指針等編譯期常量也可以。最常見的就是std::arrayT, N第二個(gè)參數(shù)N是std::size_t類型的非類型模板參數(shù)。templatetypename T, size_t Capacity class FixedBuffer { public: T operator[](size_t index) { return data_[index]; } size_t capacity() const { return Capacity; } private: T data_[Capacity]; }; FixedBufferint, 256 buf;寫T data_[Capacity]意味著Capacity必須是一個(gè)編譯期已知的常量表達(dá)式不能是變量也不能是函數(shù)返回的運(yùn)行時(shí)值。聯(lián)系到上一節(jié)的實(shí)例化機(jī)制FixedBufferint, 256和FixedBufferint, 512也是兩個(gè)不同的類型因?yàn)樯傻膬?nèi)部數(shù)組大小不同。非類型模板參數(shù)的類型限制在不同標(biāo)準(zhǔn)版本里有變化。早期只允許整型、枚舉、指針和左值引用到了 C20結(jié)構(gòu)體類型的字面量也可以作為非類型模板參數(shù)。實(shí)際工程里最常見的仍然是非負(fù)整數(shù)和指針別在模板參數(shù)列表里塞浮點(diǎn)數(shù)double——浮點(diǎn)數(shù)在編譯期比較多少存在精度和等價(jià)性問題標(biāo)準(zhǔn)過去明確禁止現(xiàn)在某些場(chǎng)景仍容易踩坑。3.2 默認(rèn)模板參數(shù)什么時(shí)候能用、什么時(shí)候不能用類模板和函數(shù)類似也可以給模板參數(shù)一個(gè)默認(rèn)值templatetypename T, typename Container std::vectorT class Stack { public: void push(const T value) { data_.push_back(value); } private: Container data_; }; Stackint s1; // 相當(dāng)于 Stackint, std::vectorint Stackint, std::dequeint s2;給第二個(gè)模板參數(shù)默認(rèn)值之后就能在不指定Container的情況下直接使用Stackint。需要注意默認(rèn)值的展開是“參數(shù)相關(guān)”的std::vectorT里的T是第一個(gè)模板參數(shù)C 的默認(rèn)模板參數(shù)允許引用前面的模板參數(shù)這是合法的而且非常實(shí)用。不過你不能讓一個(gè)帶默認(rèn)值的參數(shù)出現(xiàn)在不帶默認(rèn)值的參數(shù)前面除非編譯器能推斷出該參數(shù)的實(shí)參。規(guī)則和函數(shù)默認(rèn)參數(shù)很像一旦某個(gè)參數(shù)開始使用默認(rèn)值后面所有參數(shù)也必須提供默認(rèn)值。類模板構(gòu)造時(shí)如果想顯式指定Container但讓第一個(gè)參數(shù)用默認(rèn)值那是做不到的因?yàn)槟0鍖?shí)參按位置匹配沒辦法“跳過”。3.3 全特化與偏特化當(dāng)同一套代碼覆蓋不了特殊情況類模板的通用實(shí)現(xiàn)是針對(duì)絕大多數(shù)類型的但某些具體類型可能需要完全不同的處理。比如你要寫一個(gè)通用的類型信息打印工具TypeDescriberT對(duì)普通類型返回名字對(duì)int和std::string單獨(dú)給出更具體的信息。這時(shí)就可以做全特化。#include string templatetypename T struct TypeDescriber { static const char* name() { return unknown; } }; template struct TypeDescriberint { static const char* name() { return int; } }; template struct TypeDescriberstd::string { static const char* name() { return std::string; } };寫法是先寫template表示這是一個(gè)對(duì)某個(gè)具體類型的全特化后面跟struct TypeDescriberint。注意template后面是空的尖括號(hào)不是templatetypename T。當(dāng)你調(diào)用TypeDescriberdouble::name()時(shí)走通用版本調(diào)用TypeDescriberint::name()時(shí)走特化版本。偏特化則更進(jìn)一步你并不把所有模板參數(shù)都確定下來而是對(duì)某一類形態(tài)做定制。比如“所有指針類型”是一個(gè)形態(tài)“所有 const 限定類型”是另一個(gè)形態(tài)templatetypename T struct TypeDescriberT* { static const char* name() { return pointer; } }; templatetypename T struct TypeDescriberconst T { static const char* name() { return const value; } };偏特化最常見的形態(tài)包括指針類型、引用類型、std::arrayT, N這種容器類型。本質(zhì)上編譯器在模板匹配時(shí)會(huì)優(yōu)先選擇更特化的版本。它能支持非常復(fù)雜的模式匹配比如templatetypename T, typename U struct X;可以偏特化出templatetypename U struct Xint, U這意味著“當(dāng)?shù)谝粋€(gè)參數(shù)是int時(shí)就用這套特別的實(shí)現(xiàn)”。掌握這一招寫類型萃取和編譯期分發(fā)會(huì)輕松很多。3.4 特化誤用警告不要試圖偏特化函數(shù)模板這里想特別提醒一句類模板可以偏特化函數(shù)模板不能偏特化。很多人學(xué)到類模板偏特化后會(huì)順手在函數(shù)模板上試// 不要這樣寫編譯器會(huì)報(bào)錯(cuò)或者行為不符合預(yù)期 templatetypename T void foo(T value) {} templatetypename T void fooT*(T* value) {} // 函數(shù)模板不能偏特化函數(shù)模板如果要對(duì)指針做特殊處理更常規(guī)的做法是使用函數(shù)重載或者通過 C20 的requires約束實(shí)現(xiàn)。你不必非要“修正”這一限制。理解了類模板偏特化和全特化的區(qū)別工程中就夠用了。4. 成員函數(shù)、友元和繼承類模板組合玩法中的容易出事點(diǎn)4.1 依賴類型必須寫 typename寫類模板時(shí)成員變量或者函數(shù)體里經(jīng)常會(huì)用到“依賴類型”也就是依賴于模板參數(shù)的類型。比如你希望T內(nèi)部包含一個(gè)iterator類型templatetypename T class CollectionHelper { public: void iterate() { // 這里 T::iterator 是依賴類型 typename T::iterator it container_.begin(); while (it ! container_.end()) { it; } } private: T container_; };T::iterator為什么必須加typename因?yàn)樵诰幾g器眼里T是未知的T::iterator可能是一個(gè)類型也可能是T里的一個(gè)靜態(tài)變量名。C 語法規(guī)定在模板中默認(rèn)把這種限定名當(dāng)作值處理除非你顯式用typename告訴它“這是一個(gè)類型”。不加typename時(shí)編譯錯(cuò)誤往往很繞比如“需要類型說明符”或“缺少;”。這個(gè)錯(cuò)誤在類模板里非常高頻我在很多代碼評(píng)審里都見過。同樣的規(guī)則還體現(xiàn)在類型別名上templatetypename T using IteratorType typename T::iterator;4.2 友元函數(shù)在類模板內(nèi)部的兩種寫法普通類的友元很好理解類模板里的友元稍微復(fù)雜。最常見、也最不容易出錯(cuò)的是“在類內(nèi)部直接定義友元函數(shù)”此時(shí)友元函數(shù)和當(dāng)前模板實(shí)例綁在一起templatetypename T class Number { public: Number(T value) : value_(value) {} friend Number operator(const Number lhs, const Number rhs) { return Number(lhs.value_ rhs.value_); } private: T value_; };這樣每次實(shí)例化Numberint時(shí)會(huì)同時(shí)生成一個(gè)對(duì)應(yīng)的operator(const Numberint, const Numberint)函數(shù)。它只接受與當(dāng)前實(shí)例化完全匹配的類型避免了跨類型的隱式轉(zhuǎn)換問題。很多運(yùn)算符重載的模板實(shí)現(xiàn)都用這種內(nèi)聯(lián)友元寫法。如果你想在類外定義友元函數(shù)需要先聲明模板函數(shù)再在友元聲明處用模板參數(shù)來“特指”寫法比較繁瑣而且很容易出現(xiàn)“友元函數(shù)模板匹配不上”的謎之錯(cuò)誤。對(duì)于大多數(shù)業(yè)務(wù)代碼我更推薦優(yōu)先用成員函數(shù)或者內(nèi)聯(lián)友元只有在需要支持形如T U這樣兩個(gè)不同類型同時(shí)參與運(yùn)算時(shí)才考慮外部模板函數(shù)配合友元。4.3 繼承類模板注意依賴基類名字的坑類模板也可以繼承其它類模板。這個(gè)場(chǎng)景在實(shí)現(xiàn)“自定義容器適配器”或者“策略模式”時(shí)經(jīng)常遇到。比如基類是一個(gè)帶有某個(gè)成員函數(shù)的模板templatetypename T class Base { public: void baseMethod() { // ... } }; templatetypename T class Derived : public BaseT { public: void derivedMethod() { baseMethod(); // 這里可能編譯失敗 } };在模板派生類里直接寫baseMethod()可能報(bào)錯(cuò)因?yàn)榫幾g器在解析非依賴名字時(shí)不會(huì)去依賴基類BaseT中查找——在模板定義階段它對(duì)BaseT一無所知不能確定baseMethod是否存在。解決辦法是用this-讓它變成依賴表達(dá)式或者顯式寫B(tài)aseT::baseMethod()templatetypename T class Derived : public BaseT { public: void derivedMethod() { this-baseMethod(); BaseT::baseMethod(); } };這個(gè)看起來像“多此一舉”的this-實(shí)際上是模板兩階段查找機(jī)制的直接后果。只有理解了這個(gè)規(guī)則遇到這類報(bào)錯(cuò)時(shí)才會(huì)想到去加this-而不是懷疑編譯器壞了。5. 模板代碼為什么必須放頭文件編譯模型與鏈接錯(cuò)誤5.1 編譯器要看到完整的模板定義才能“按實(shí)參生成代碼”普通類的做法是頭文件放聲明源文件放實(shí)現(xiàn)調(diào)用方編譯時(shí)只需看到類聲明。但類模板不能這么干。原因很簡單編譯器在Stackint s;這一行需要知道Stackint的完整定義包括成員變量大小、成員函數(shù)函數(shù)體才能生成代碼。如果頭文件里只有templatetypename T class Stack;這行聲明沒有實(shí)現(xiàn)實(shí)例化時(shí)就會(huì)報(bào)“未定義類型”或鏈接階段提示缺少函數(shù)實(shí)現(xiàn)。一種常見但很糟糕的做法是試圖把模板實(shí)現(xiàn)寫在.cpp里然后讓另一個(gè).cppinclude 它。這么做經(jīng)常導(dǎo)致多份定義或者鏈接錯(cuò)誤。正確做法是把模板定義完全放在頭文件里或者至少讓實(shí)現(xiàn)對(duì)使用方可見。這不是 C 的缺陷而是模板實(shí)例化模型決定的——它不像 Java 泛型那樣在運(yùn)行時(shí)抹除類型而是在編譯期替使用方把具體類型生成出來。5.2 extern template 與顯式實(shí)例化大型工程的務(wù)實(shí)手段當(dāng)同一個(gè)模板被幾十個(gè)源文件使用同一組參數(shù)實(shí)例化時(shí)每編譯一個(gè).cpp編譯器都生成一份相同的實(shí)例化代碼鏈接器再合并去重。編譯時(shí)間會(huì)變得很難看。C11 提供了extern template幫助緩解這個(gè)問題?;酒鸩绞窃谀骋粋€(gè).cpp里顯式實(shí)例化你需要的類型// stack_inst.cpp #include Stack.h template class Stackint; template class Stackdouble;然后在頭文件里聲明這些實(shí)例在其它翻譯單元已經(jīng)存在// Stack.h extern template class Stackint; extern template class Stackdouble;這樣其它.cpp看到Stackint時(shí)會(huì)相信“它的已經(jīng)完全實(shí)例化編譯這一份時(shí)別再生成第 N 遍”從而減少編譯時(shí)間。代價(jià)是你必須提前手動(dòng)列出所有用到的類型組合這對(duì)類型不定、用戶會(huì)自由實(shí)例化的泛型組件來說并不現(xiàn)實(shí)。所以extern template通常用于庫內(nèi)部已知的熱點(diǎn)實(shí)例比如標(biāo)準(zhǔn)庫就大量用于std::string、std::vector...的顯式實(shí)例化。普通業(yè)務(wù)項(xiàng)目不必一開始就逼自己用等編譯時(shí)間真的大到影響開發(fā)效率時(shí)再針對(duì)性優(yōu)化。5.3 兩階段查找模板代碼亂序帶來的常見編譯問題模板的名字查找分為兩個(gè)階段。第一階段是解析模板定義本身時(shí)查找不依賴模板參數(shù)的名字第二階段是在實(shí)例化時(shí)查找依賴模板參數(shù)的名字。這正是上一節(jié)派生類調(diào)用基類成員需要this-的深層原因。舉一個(gè)更直白的例子同一段模板代碼放在被調(diào)用函數(shù)之前或之后結(jié)果可能不同void helper() { // ... } templatetypename T struct Test { void call() { helper(); // 第一階段就能找到非依賴名字 helper T::action(); // 第二階段實(shí)例化時(shí)查找 } };如果helper在模板定義處之后才聲明第一階段就找不到即使你實(shí)例化模板時(shí)helper已經(jīng)存在也不行。非依賴名字必須在模板定義處可見。理解了這一點(diǎn)排查“為什么模板內(nèi)調(diào)用的全局函數(shù)找不到”這類問題就知道該往哪個(gè)方向查了。6. 現(xiàn)代 C 給類模板帶來的新變化CTAD、可變參數(shù)模板與工程習(xí)慣6.1 C17 類模板實(shí)參推導(dǎo)簡化了日常使用前面提過 C17 的 CTADClass Template Argument Deduction。它最實(shí)用的場(chǎng)景是配合構(gòu)造函數(shù)推導(dǎo)類型參數(shù)減少手寫冗余聲明。比如templatetypename T struct Point { Point(T x, T y) : x_(x), y_(y) {} T x_; T y_; }; Point p(1.5, 2.5); // 推導(dǎo)出 Pointdouble如果兩個(gè)參數(shù)類型不一致比如Point p(1, 2.5)那么推導(dǎo)會(huì)失敗因?yàn)闆]有唯一確定的T。這時(shí)候編譯器報(bào)錯(cuò)反而能幫我們發(fā)現(xiàn)設(shè)計(jì)問題到底是該傳兩個(gè)int還是應(yīng)該把其中一個(gè)隱式轉(zhuǎn)換模板推導(dǎo)的理想是盡量自動(dòng)但不會(huì)替你決定潛在歧義。6.2 通過 deduction guide 糾正推導(dǎo)結(jié)果CTAD 雖然方便但推導(dǎo)結(jié)果偶爾不理想。典型場(chǎng)景是你希望模板參數(shù)類型是“去掉引用和 const 后的類型”或者想對(duì)字符串字面量做特殊處理。C17 允許自定義推導(dǎo)指引deduction guide直接告訴編譯器“遇到這種構(gòu)造方式時(shí)推導(dǎo)成什么類型”templatetypename T struct MyString { MyString(const T value) : value_(value) {} T value_; }; // 當(dāng)傳入 const char* 時(shí)不要推導(dǎo)成 const char*而希望保存為 std::string MyString(const char*) - MyStringstd::string;這樣寫MyString s hello;時(shí)推導(dǎo)結(jié)果不是MyStringconst char*而是MyStringstd::string。這個(gè)技巧在寫各種包裝類、適配器類時(shí)很常用。需要區(qū)分推導(dǎo)指引只影響推導(dǎo)并不會(huì)改變真實(shí)的構(gòu)造函數(shù)行為。6.3 可變參數(shù)類模板C11 引入的模板參數(shù)包讓類模板也能接收數(shù)量不定的類型參數(shù)。最典型的例子就是std::tupletemplatetypename... Ts struct MyTuple { MyTuple(Ts... args) : values_(args...) {} std::tupleTs... values_; }; MyTuple t(1, 2.5, std::string(hello));這里的Ts...是一個(gè)類型參數(shù)包展開后等價(jià)于把多個(gè)類型塞進(jìn)模板參數(shù)列表。你需要區(qū)分兩個(gè)展開位置類型展開和表達(dá)式展開。std::tupleTs...是類型展開MyTuple(Ts... args)是把參數(shù)包展開成構(gòu)造函數(shù)參數(shù)args...是表達(dá)式展開??勺儏?shù)模板很容易把代碼風(fēng)格推向“高級(jí) but 難讀”的極端。我用下來的體會(huì)是盡量把參數(shù)包展開集中在一兩個(gè)內(nèi)部工具函數(shù)里不要讓展開邏輯散布整個(gè)類外部。std::apply、折疊表達(dá)式這些機(jī)制也能顯著簡化展開代碼C17 以后寫起來舒服多了。6.4 我寫類模板時(shí)堅(jiān)持的幾個(gè)習(xí)慣最后分享幾條實(shí)際經(jīng)驗(yàn)都是踩過坑才總結(jié)出來的。第一類模板的對(duì)外接口盡量保持小。模板代碼一旦編譯錯(cuò)誤報(bào)錯(cuò)信息動(dòng)輒幾百行接口越復(fù)雜理解成本越高。能拆成普通函數(shù)就別把所有邏輯都塞進(jìn)模板類里保證只有真正需要類型參數(shù)的地方才用模板。第二所有依賴類型都顯式寫typename。這會(huì)讓代碼啰嗦一點(diǎn)但極大降低編譯期歧義。代碼是寫給其他人讀的typename T::iterator一眼就能看出“這是類型別名”不加則要猜半天。第三模板定義按“先聲明、后定義”組織把非模板邏輯部分盡量抽到普通函數(shù)。模板實(shí)現(xiàn)放頭文件不假但頭文件內(nèi)部依然可以分成接口聲明區(qū)、實(shí)現(xiàn)區(qū)。大型項(xiàng)目里還可以考慮把模板實(shí)現(xiàn)拆到_impl.h文件里主頭文件在末尾 include 它至少從觀賞性上會(huì)清爽很多。第四別輕易用特化做“性能 hack”。很多人拿到模板第一反應(yīng)是給特定類型做特化來優(yōu)化。特化本身沒問題但每多一個(gè)特化維護(hù)成本就多一層。業(yè)務(wù)沒有實(shí)際性能壓力時(shí)先把通用實(shí)現(xiàn)寫對(duì)再說。真要優(yōu)化用 C20 的 concepts 和requires約束來分派不同實(shí)現(xiàn)代碼語義比滿天飛的template清晰得多。模板是 C 最有表達(dá)力也最考驗(yàn)人的一個(gè)部分。類模板作為模板體系的基石值得每個(gè)人花時(shí)間把實(shí)例化、特化、友元、繼承這些邊界都過一遍。真正掌握它的標(biāo)志不是能背語法而是面對(duì)一條報(bào)錯(cuò)時(shí)能在腦子里快速定位這多半是依賴類型沒寫typename還是模板實(shí)現(xiàn)沒被實(shí)例化到還是名字查找階段就出了問題。有了這個(gè)定位能力模板世界的門檻就基本被跨過了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
日本三级久| 超碰 另类 欧美| 亚洲综合网电影91| 中文字幕黄色一起草| 日韩去日本高清在| 中文字幕欧美丝袜07资源| 久久熟女人| 精品性爱| 狼天天狼天天大香蕉| 国产精品另类一区大香蕉| 大香网站| 深夜视频| 久久99手机免费视频| 2023天天操夜夜操| 久久亚洲一区女同性恋中文字幕| 天天综合精品| 国产传媒午夜理伦精品| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 久久久无码精品人妻二区| 日日夜夜天天| 美女被艹尤物视频| AAA久久| 亚洲有码视频二区| 在线情色电影 91大 | 欧美色图片欧美色图| 国产做?爰片久久毛片?片美国| 小电影欧美91| 视频黄站| 日韩精品人妻系列无码天堂| 密臀在线免费观看| 亚洲五月婷| 一个国产在线综合网站| 国产精品香蕉| 久久久久久中文| 极品丝袜无码| www.91欧美| 26uuu国产| 网站A V在线| 婷婷五月天色网| 97在线免费看| 91性感网站| 五月天精品| 婷婷色在线| 美中日韩无码| 99在线精品观看99| 国人欧美精品一区二区| 97资源视频| Av手机版天堂网| www.yeyecao| 在线色导航| 夜草网站| 婷婷精品视频| 国产1727欧美| 欧美人妖内射| 青青草原香蕉日本Ap| nuu12国产麻豆精品| 成人AV在线网站| 日韩大香蕉AV影片| 69XX一中文字幕人妻91| 人人看欧美性爱| a亚洲欧美色欲| 成人日韩3| 欧美激情久操网| 久久人人舔人人爽舔人人av片| 久久九九视频九九视频| 日韩性爱1级片视频| 国模精品娜娜一二三区| 九九热免费国产视频婷婷伊人| 丝袜制服字幕在线| 搞中出视频在线观看| 欧美日韩亚洲五月天婷婷| 天欧美在线| 亚洲精品九九九| 国产最火爆久久国产网站网站 | 国产91专区| 精品免费囯产一区二区三区| 中文字幕人成乱码熟女香港| 丁香五月激情五月| 自拍亚洲综合| 久久久少妇诱惑精品视频| 另类欧美色| 久久成人国产精品| 一区不卡在线观看av| 亚欧高清在线| 五月开心网| 宗合情欲网| 日日摸日日碰| 黄色香蕉视频网站一区| 成人性爱av.com| 欧苏综合色综合| 久久精品视频28| 91熟女网| www.91人妻.com| 91热爆在线| 中国黑人三级片网站上区| 伊人一区二区三区| 欧美96精品在线| 日本孕妇一区二区视频操逼免费看 | 草草草视频| 在线播放免费av福利片| 啊a一区在线| 狼人综合婷婷激情四射| 天天综合色图| 91色久| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 一本精品日本在线视频精品| 超碰超碰95| 青青草AV色| 操日韩第| 嗯嗯嗯啊啊啊干死我吧| 91社区拍啪人妻| 亚洲淫乱骚妇AV| 91麻豆天美传媒在线| 日本性感人妻91| 欧美一级色| 97伊人超碰| 亚洲制服欧美另类内射| 久久国产视频专区一二三| 大香蕉www.超碰| 久久久久久久久久久久久久9999| 国产和美国毛片| 中文字幕丰满子伦无码专区在线视频最新 | 黄日韩| 2017天天插| 三级片网站在线播放| 黄色十八禁| 又大又长又粗又爽又黄| 啊…啊…操我用力操我| 久草尤物| 美女丝袜激情小说| 在线视频日韩欧美国产| 91欧美网| 久久综合日韩亚洲欧美| 影音先锋中文字幕日本好一区二区| 婷婷15月天青娱乐| 一区二区激情国产熟女| 懂色av一区二区三区天美传媒| 日本一级一级一级一级| 亚洲日韩人妻中文字幕一区| 日韩午夜国产| 亚洲啪啪性视频| 国语精品av| 色99在线| 人人操人人摸人人看人人干| 深夜激情| 激情文学欧美| 一级毛片久久久久久久女人18| 91久久堂| 男人的天堂2010| 97视频网站| 狠狠操狠狠插| 国内毛片热久久思思热| 欧美 亚洲 大香| 日本成人A片免费看| 久久久久久少妇| 丰满美女一级毛片在线播放| 夜夜青青无码影院| 欧美在线视频99| 综合亚洲欧美精品日韩?v| 色综和网| 超碰 97国产熟女| 艹精品| 久久久999国产| 又黄又爽在线观看视频| 久久九九视频九九视频| 日韩精品中文字幕一 | 久久久久九九九| 欧美性暴力| 青草影院内射高潮| 刺激精品视频| 精品一区二区3区| 一区二区三区 日韩欧美| 亚洲 欧美综合| 亚洲大色堂| 长长久久曰曰夜夜成人网| 蜜乳成人AV| 国产免费内射视频| 搡老熟女国产1000部| 强奸乱伦av电影| 欧美裸体美女日麻屄| 亚洲国产青青| 久久久专区| 亚洲啪啪性视频| 国产高清成人mv在线观看| 一区二区高清视频| 国产路线专区| 日韩97在线| 99精品综合久久久久五月天| 欧美精品,四区。五区| 91是天天| http://qxhbdz.com| 亚洲色综合| 自拍大香蕉乱插| 日韩高清黄片| 成全在线观看免费观看| 九九视频黄色片| 啊啊啊啊啊啊在线观看| 久久 精品| 中文字幕青青草| 精品综合久久久久久97| 福利一级版子| 国产嫩草精品A88AV| AV天黑人| 91麻豆天美国产欧美高潮| 亚洲 欧美 综合 91| 青青草久久一区网| 99re69综合| 成人日韩中文字幕| 久久久久密臀视频| 91老熟女老女人国产老太| 午夜欧美J进J出白浆流出久久久| 日本东京热大香蕉a片| 人妻出轨一区二区三区| 嗯嗯嗯,草死我| 麻豆蜜桃视频在线观看| 1024亚洲中文字幕久在线看片你懂的| 久久久久久久久久久久久久久性生活视频| 欧美在线色图| 97精品一区| 天堂亚洲欧美| 91久久青青草原精品| 91久久青青草原精品| 午夜国产成人精品视频| 6080YYY午夜理论片在线观看| 超碰国产精品久| jk白丝没脱就开始啪啪| 探花一区在线| 午夜人妻精品综合在线| 99国产天美| 国产视频小说| 亚洲天天自拍| se吧提供91精品国产91久久久久久| 东京热免费视频| 久久久久久午夜男人的天堂| 嗯阿好爽好紧| 亚洲综合校园春色| 97免费视频在线| 少妇熟女1区2区3区| 亚洲第一免费视频| 久久99热这里只频精品6学生| 啊嗯好大视频在线观看| 极品AV网站在线观看| 美女天天干| 婷婷综合伊人一区| AV综合中文字幕干| 插老姨肥穴| 超碰视97中文| 综合国产影视三级| www.狠狠操| 久久久av爱| av2014 日韩在线中文字幕| 国产强奸乱伦第1页| 日韩av不卡在线看| 国产丝袜视频| 亚洲久久东京热一二三四五区视频| 熟妇人妻丰满久久久久久久无码| 91精品久久久久五月天精品| 亚洲综合五月天| 亚洲男人天堂2016| 大香蕉综合网| 亚洲av影院在线观看| 蜜桃精品一区二区三区ww | 亚洲精美粉嫩嫩泬在线观看| 婷婷影院入口| 蜜臀久久久国产| 精品熟女呻吟久久91| 特级毛片特黄久久免费看| 人妻久热在线| 欧美性爱一区二区三区| av在线一区二区三区| 又黄又爽在线观看视频| 91色宗合| 在线啊v一区| 亚洲 另类 丝袜 自拍 动漫| 八戒无码国产午夜福利| 国产精品高潮久久AV| 亚洲天天更新| 色婷婷久久| 国产精品夜夜夜| 秋霞网—男女啪啪亚洲免费体验区 | 精精夜夜| 97在线免费视频| 这里只有精品久久| 天堂亚洲精品| 婷婷丁香在线| 国产精品噜噜噜日日日| 久久五月天婷婷| 国内精品嫩模A∨私拍小视频| 99久久久无码国产精品性男| 久操| 久久香蕉国产线看观看猫咪av| 亚洲色图美腿丝袜| 中文字幕久热视频在线| 超碰日韩美妻| 欧美成人黄网色网站| 丝袜美腿射精91| 最新亚洲人成网站在线影院| 久久久久久久久国产| 在线视频免费播放一区| 久久久久久裸体| 精品人妻av在线播放| 久久神马影院| 成年人性爱日韩| asc国产精品| 中文字幕日本久久| 欧美精品一二三| 久超碰在| 久久久亚洲Av| 蜜区区视频79| 人妻啊啊人妻啊啊| 亚洲日韩视频二区| 中文在线视频| 久久男人的天堂国产| 天天干人人看综合| 久久久网一区| 高清国产av无码| 超碰91在线| 久草视频制服诱惑| 国产女人和拘做爰视频 | 欧美日韩一区二区三区四区蜜桃| 亚洲97网站| 色五月激情综合网| 久久一区二区高清免费| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区 | 影音先锋乱| 近亲乱伦一区二区| 日本123区操B视频| 97电影院超碰| 蜜臀99999| 亚洲日精品| 又大又大又大又粗爽高潮观看| 欧美成人一级麻豆| 性久久| 亚洲福利中文字幕在线| 国产精品91一样| 污污污8888| 91热| 无码日韩人妻av一| 无码99| 欧美18 在线观看| 伊人久久久日韩一区| 91九九九馒头| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 日韩综合97p| 国产高潮AA片免费看| 日本97久久久精品| 日韩熟女乱伦中出| 91美女高潮| 志村玲子视频一区二区| 91亚洲黄色网| 强奸乱伦AV一天堂网| 尤物黄色在线观看网站| 日本三级韩三级99久久| 超碰精品日韩欧美国产| 亚洲综合影片| 婷婷中文网| 亚洲熟妇A V黑人| 超碰色97| 激情四射婷婷六月天| 久久久久密| 国产9 9在线 | 亚洲| 91性生活久久久| 欧美亚洲国产自久久| 91色艳| 欧美精品23| 一区二区三区蜜桃成人撸久久东京热| 动漫片子网站3黄| 91干熟女| 综合熟女| 色五月亚洲| 日韩精彩免费| 国产精品一区二区a| 91内射| 五月丁香啪啪啪| 夜夜精品视频| 四虎884a| av婷婷色婷婷色六月| 黄久在线| 校园春色制服丝袜中文字亚洲| 欧美日韩亚洲天堂| 丝袜内射| 手机看片1025| 色吧5亚洲| 一区二区视频你懂的| 欧美一级A片在线看视频性色| 99日视频在线免费| 91老司机在线视频免费观看| 高清成年美女黄网站免费大全| 999熟女精品| 伊人久久88国产女| 欧美性生活免费网| AV天堂因数| 牛牛久久国产精品视频一二三| 噜噜噜无码AV一级一级久久影院| 精品无码一区二区三区色欲| 91影视亚洲| 开心六月色| 亚洲精品视频在线| 人妻81p| 97色网| 91精品导航| 欧美天堂第二区| 亚洲精品久| 中文字幕成人| 福利色色| 青椒国产97在线熟女| 中日韩免费看男女操逼大全| 亚洲怡春院| 欧美色五月| 超碰成人最新最好看| 97视频在线免费播放| 首页中文字幕中文字幕免费| 日韩综合97p| 色色色欧美| 日韩99神马视频片| 97超碰公开| 欧美性爱1080p| 91蜜臀在线久久久久| 乱欲性色| 深夜国产一区二区三区在线看| 精品免费视频国产一区| 粉嫩av一区二区三区四季| 天美av在线观看| 国产诱惑| 另类欧美色| 日本布卡一区二三区| 色哟哟综合| 婷婷啪啪| 亚洲精品欧洲色| 无码精品久久久久久亚洲| 精品国产一区二区三区四区在线看 | 97色婷婷| 日韩偷拍色图| 制服少妇欧美| 久久精品一区二区三区蜜桃臀| 黄色十八禁| 91操熟女视频| 男啪女色黄无遮挡免费观看| 操操操五月天婷婷丁香影院| 天天射天天| 操逼逼中文字幕| www.天天干| 2000亚洲男人天堂| 亚洲欧美情色| 色婷婷激一区二区三区 | 97WW精品| 91n免费处女| 国产h小视频在线观看免费| 国产一进一出视频网站| 色婷婷丁香五月| 熟妇国产免费一区| 婷婷超| 国产 日韩 另类 视频一区爱| 97视频观看| 99热欧美| 看一级特黄a大一片| 99999久久久久9国产精品| 天欧美在线| 亚州免费啪啪视频| 日本 免费 一区二区三区 久久香蕉 | 丁香五月激情网| 久久久久婷婷精品av电影| 欧美人与动性人交a| 97五月天| 欧洲综合色图| 91碰碰| 日韩超碰精品综合| 日韩精品怡红院| 综合情欲网| 国产人人干| 极品美女嘿咻| 91美| 国产精品经典一卡久久久 | 国产主播福利| 国产夜夜操| 逼逼逼逼操操操操操操操操操午夜剧场| 日韩美女,国产传媒,视频一区| 亚洲男人的天堂va亚洲男人社| 婷婷亚洲五月***久久| 久久久少妇诱惑精品视频| 物尤视频一区二区| 久久久久人妻二区精品叶可怜| 国产无遮挡| 人人摸人人干| 一区二区娱乐网站| 色色色色电影网| 五月丁香黄色网| 欧美日韩色综合网| 国产久9| 亚洲国内精品成人不卡| 色眯眯av| 精品国产一区二区三区久久久蜜臀 | 亚洲一区二区三区播放在线| 国产精品毛片| 久久久久久AⅤ无码免费肉站| 蜜臀在线网站| 厕所偷拍在线| 乱伦AVxx| 淫妻综合网| 免费一级黄色录像影片| 日韩三级av片| a人片中文字幕一区二区| 五月婷婷影院| 福利在线观看一区二区| 成年无码动漫av片无尽在线| 久久精品99久久久久久| 欧美色三级片91| 91人妻Pr| 黑人无码一区二区| 日韩无码操逼片| 激情小说亚洲| 9久久精品| 91精品国| 亚洲天堂久| 四虎在线播放| 九九九久久久久| 国产无遮挡| 亚洲天堂另类小说男人| 欧美有码激情视频一区二区三区| 国产伦乱91| wwwcaobibi| 中文字幕日本久久| 免费在线观看国内色片网站网址| 欧美一级美片在线观看免费| 五月婷亚洲精品天堂| 五十路熟女人妻一区二区在线观看 | 精品久久青青草| 性爱久久| 久久这里精品国产99丫e6| 青青草自拍视频在线播放| 日日狠狠久久偷偷色综合免费| 99综合| 精品久一区免费| a'v在线资源| 日韩精品碰碰| 极品销魂美女一区二区| av一区二区三区四区五区久草臀| 色色婷婷丁香| 樱花蜜乳av| 欧洲综合色| 一本一道vs波多野结衣| 白丝1区2区3区| 9999久久久| 综合欧美激情网| 97色欧州| 中文字幕在线免费观看 | 色五月激情网| 熟女精品va中文字幕| www.狠狠操| 999久久久九九九九| 强奸a片网| 天天操夜夜操| 亚洲天堂另类小说男人| 天天肏夜夜肏| 亚洲乱熟女一区二区| 91熟女丨老女人| 日韩天堂av电影在线观看| 久久久久国产精品人妻aⅴ天堂| 亚洲欧美综合网 | 色噜噜狠狠色综无码久久合欧美| 韩国三级一线观看久| 大香蕉免费乱伦视频| 性色乱AV一区二区| 久久综合97| 久久人妻视频| 人人操人人插人人摸人人干| 不卡在线一区,精品一区二区三区中| 欧美一区二区成人一卡| 欧美亚洲自拍另类人妻| 欧美99热| 91麻豆天美国产欧美高潮| 日韩免费大片一级播放| 久操在97| 手机在线中文字幕国产| 884t在线| 干干干天天| 久久亚码| 国产精选三级在线观看| 国产第11页| 蜜桃av综合网发布| 综合性视频99| 日韩另类| 蜜臀久久99精品久久久久久婷婷| 人人色人人操在线| 一区二区三区看视频| 九九久久综合| 丰满人妻一区二区三区| 成人精品在线免费视频| 性爱视频无打码在线观看| 九九热免费国产视频婷婷伊人| 亚洲不雅视频1区二区| 欧美亚洲丝袜人妻制服99| 放黄片放3级黄片没穿衣服| 国产怡红院| 日本狂喷奶水在线播放212| 免费国产| 麻豆美女丝袜人妻中文| 国产精品久久久久9999小说| 欧美性爱免费短视频| 一区二区三区精品久久| 日韩内射视频| 另类欧美色| 粉嫩不卡一区二区性爱| 青青草丝袜在线视频| 男女无套 免费网站| 国产一区二区久久| 妇人噜噜| 高清肉丝中文无码| 大香蕉色欲AV| 9精品久久久久| 小骚逼被操的爽不爽| 69视频入口| 91少妇香蕉久久精品| 曰韩欧美国产传媒麻豆第一区| 亚洲中文人妻色| 18禁止看精品中文字幕| 久96热在线观看视频| 91国产丝袜美女| 99久久精品无码一区二区| 啊啊啊啊二区好大| 国产欧美日本亚洲精品| 一及黄久一点| 91熟女丨老女人| 国产高清成人传媒影视| 少妇的嫩逼图片| 亚洲字幕一区二区| 欧美少妇一区二区三区| av一区二区三区不卡| 啊啊啊啊免费视频| julia高潮后不停追击中出| 亚洲AV无码AV吞精久久久久| 啪啪性爱免费视频| 粉嫩av平台| 在线播放成人高清免费视频| 亚洲开心网| 国产一区二区二区按摩精品啪视频| 蜜臀99久久国产| 麻豆91熟妇人妻中文字幕茄子| 97伦综合| 欧差乱伦二三| 久久久国产av美女私房| 三级特黄60分钟播放| 性久久| 人人操人人摸人 | 91亚洲欧美| 国产品精品自在在线午夜免费| 亚洲无码精品AV久久久| 变态乱伦伪娘灌肠一区二区| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 九色97| 欧美色图偷拍另类| 后入福利视频| 男人天堂欧美| 97人妻免费中文字幕| 人妻丝袜无 码视频专区| 国产乱婷婷精品二区三区| 日本中文字幕一区| 超碰免费人妻在线| 日本欧美亚洲高清在线看| 色婷婷亚洲婷婷| 青草视频人妻在线观看| 99999国产| 午夜男人av| 一区二区三区 丝袜 高跟 美腿| 性色av一区二区| 九九九久久久| 久久露脸国产老熟女| 日影院久久婷婷夜夜网| 日韩亚洲欧美中文字幕| 久久精品美女一区| 九九国产| 岛国A V在线免费看| 狠狠色丁香| 中国国产精品一区视频| B049AV在线播放| 久久大线蕉一区| 超碰日本97美女人妻人人玩人人爱| 首页中文字幕中文字幕免费| 91碰碰| 亚洲av影院在线观看| 亚洲无码?第一页| 青青操视频在线| 另类一区| 不卡av免费在线网址| www久| 欧美色老汉| 国产传媒日本欧美专区| 亚洲AV无码AV吞精久久久久| 97超碰免费生活| 天天干天天舔| 久久免费看高潮毛片韩国| 超碰人妻久久| 91精品国产麻豆国产自产在| juliaann欧美丝袜办公室| 中文字幕在线免费观看| 婷婷五月激情综合| 美女91| 伊人五月天青青草婷婷| 激情 欧美 亚洲 小说| 亚洲中文电影| av天堂手机版追回| 男人的天堂VA| 东北女人| 99精品久久| 久久久久久亚洲Av无码| 亚洲AV色图一区| 人妻激情另类| 亚洲AV秘 精品久久老牛影视| 人妻激情视频| 吉田爱美AV在线| 日韩av乱伦| 人妻干天天| 亚洲人妻五月丁香婷婷| 国产精品高潮久久AV| 日韩成人免费电影| 亚洲天堂AV在线播放| 91熟女在线| 午夜精品久久久久久久| 岛国小电影| 日本免费中文一区二区三区四区 | 亚洲图片欧美偷拍| 久久夜夜夜| 中文字幕视频一区视频二区| 日本精品高清一二区一本到| 久久亚洲AV无码白度| 欧美97av| 亚洲AV色图一区| 91丝袜激情在线| 亚洲日本韩国极品一区二区| 大香蕉黄色一区| 欧美色性爱| 成人av福利在线观看| 少妇久久久| 国产v亚洲v日韩v欧美v片另类| 99精品九九九九九九| 91综合天天看| 久久久久久久久9| 亚洲精品国产熟女久久久| 欧美日韩天堂| 激情四射婷婷六月天| 色五月激情AV在线| 舔人妻中文免费视频| 偷窥自拍亚洲| 天天干18禁| AAAA级日本片免费视频| 青青操少妇| 夜夜高潮夜夜爽国产伦精品| 久青草影院| 3PAV乱伦视频| 麻豆影音天美视频| 殴美大黄片| 天天综合中文字幕 91| 天无日色综合| 国产精品一区二区亚洲人成毛片| 欧日a| 青青草九九九九九| 一区二三区四区视频大全套| 精品传媒在线一区| 久久毛卡| 婷婷15月天青娱乐| 最新av中文字幕高清| 日韩人妻 中文字幕| 久久婷婷一区二| 国产精品久久9| 欧洲性人爱视频| 九九九精品| 亚洲国产一区二区三区四区国产| 一区二区三区四区久久视1| 岛国片在线观看视频亚洲| 欧美 亚洲 偷拍自拍| 操逼操操操91| 97在线欧洲| 人妻天天爽夜夜爽2| 东京热毛片177b2viP| 强奸乱伦免费网站| 婷婷综合在线观看| 欧美综合色站| 淫荡少妇免费| 天天躁日日躁XXXXYY| 黄总AV色图| 中日韓欧美高清| 日本中文字幕在线电影| 成人一区二区三区四区| 沈阳熟女高潮对白视频| 一区二区偷拍拍视频| 亚洲女人毛茸茸91| 国产超碰人人爽人人做| 大香蕉男人的天堂| 精品无码不卡视频| 色欲色香天天天综合网www-亚洲综合国| 思思久热在线精品66| 精品精品精品| 精品无码欧美三级| 日本三级人妻a人妻一在线| 久久久久夜夜夜夜| 夜夜爽妓女| 熟女激情综合网| 96国产污污污丝袜| 91人妻素女| juliaann欧美丝袜办公室| 99操视频| CCYY草草影院地址入口| 9热9热综合网| 国产三级多多影院2022国产AA一级毛片无码| 欧美 日韩 国产传媒| 2020中文在线一区二区三区| 我想要啊 啊 啊| 五月丁香久久| 国产黄色影片在线观看| 无毛精品| 国产欧美一区二区| 在线a v| 日韩97P| 中文字幕人乱码中文字的预防方法 | 日本91白丝| 精品国产一区二区三区四区在线看| 天天内射| 欧美一区二区在线资源| 亚州AV无码国产精品| 大香蕉欧美| 曰本道人妻久久久在线不卡色视频 | 亚洲天堂人人妻| 99热综合| 99久久精品国产高潮| 一起草三级AV电影在线观看| 天天综合站| 一本久久精品中文字| 999日韩中文精品观看视频。| 色久桃花影院在线观看| 久草尤物| 性无码专区2020| 久久久久久九九九| 极品色综合| 久久伊人东京热| 人人性爱视频免费| 久久69| 手机在线中文字幕国产| 中日韩久久人妻一区二区| 亚洲国产精品无石码久久| 久久亚洲AV无码专区首页| 亚洲色图欧美色图制服丝袜| 97天天综合| 噜噜噜狠狠色综合| 97色欧洲| 91综合色噜噜| 亚洲图片日本AⅤ欧美在线| 天堂俺去俺来也www久久婷婷| 一级片在线观看高清无码| 精品成人动漫一区二区| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 欧州激情视频在线一区二区| 色好看av| 亚洲欧洲日韩天堂av| 日本999精品| 免费的很黄很污的全部视频| 麻豆区久久久久亚| 国产成人+综合亚洲+天堂| 欧美加勒比| 2025亚洲男人天堂| 91深夜夜| 国产一区二区精品久久久不卡蜜臀| 成人日韩欧美| 国产一区二区三区高清视频| 你草精品在线视频| 国产三区免费在线观看| 日韩有码中文字幕女同性恋 | 日韩精品一区二区人人人| 天天添天天干电影| 一区二区三区亚洲| 国产超碰97| 91女在线观看| 乱伦Av网| 97超碰久久| 亚州色阁| 电影69乱码96| 郑州宾馆老熟女露脸啪啪| 啊啊啊慢点| 麻豆性爱视频在线播放| 国产超碰| 人人操人人摸avav| 夜夜黄| 久久久99久9| 成人性爱高清视频免费看| 超碰97人妻在线| 99热国产| 爱干爱射网啊啊啊| 日本色色色| av网站在线观看了| 久久日本熟妇熟色一区| 久久精品视| 亚洲AV乱码专区国产噜噜亚洲| 蜜乳性色无码专日粉嫩骚逼AV| 久久男人的天堂| 2020中文字幕在线| 啊啊好多水| 国产毛片精品一区二区色欲黄A片| 一级做a爰片久久毛片图片| 黑人在线91| 啊嗯嗯啊好大好爽| 丝袜喷水在线| 猛交交| 无遮挡h肉动漫在线观看| 欧美成熟性爱精品| 欧美美女视频| 激情文学小说一区二区| 亚州色图欧美| 中文字幕 一区二区 亚洲无码| 欧美日韩第一页| 黄色一区二区秘书性感| 日韩av无码网站| 91狠狠综合久久| 熟妇激情| 亚洲和欧美裸体美女双飞视频| 亚洲欧洲偷拍一区| 久久久久9| 亚洲AV无线| 日韩av不卡在线看| 一个色导综合| 激情黄色片在线观看| 女人天堂网| 日日干日日操五月天伦理视频| 五月天婷婷影院| 欧美精品999| 视频分类 国内精品| 国产精品一区二区三区,亚洲综合| 久久久精品91八戒| 精品国产三级av韩国在线| 91久久久久久久久18| 日日不卡av| 久操频道免费在线呗看| 青草伊人网| 欧美自拍网| 91在线观看,天天综合| 亚洲人综合| 日韩人人精品| 啊啊啊啊在线播放| 一区二区三区在线日韩影院观看| 亚洲性少妇| 麻豆人妻偷人精品无码视频| 国产精品丝袜久久亚洲不卡| 欧美成人色| 欧美少妇高潮久久91| 四虎在线播放| 蜜臀久久精品久久久久视频| 夜夜 中文视频rt| 福利大香蕉| 久久久久深夜无码| 欧美啪啪啪91| 亚洲黄色| 一级一性爱免费视频| 粉嫩av平台| 吖在线不卡一区二区国产剧情| 国产亚洲精品激情| 福利视频一区二区微拍| 深夜激情无码| 日日夜夜狠狠| 干B视频伊人网| 亚洲色香| 夜夜骑日日| 97碰久久| 成人性爱AV在线免费观看| 黄片色区软件| 色色五月婷| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 色精品极品| 99精品网站| 久久后入制服| 97超碰超碰| 美国精品国产精品| 亚洲精品无码少妇久久| 亚洲日韩AV视色| 91成人在线| 嗯嗯嗯啊啊在线观看| 九九碰九九爱97超| 欧美性爱第一区| 久9视频| 久草资源在线视频官方总站日韩丝袜美腿| 裸体1区| 青青草好吊色| 在线观看无码三级少妇| 超碰人人干| 75大香蕉| 香蕉精品二区二区 | 日本97久久久精品| 啊啊啊操死我了| 亚洲人妻中文在线视频| 日本午夜久久电影| 另类亚洲图色| 97在线播放| 成人性爱AV在线免费观看| 精品久久久亚洲AV成人网站| 免費人妻夜夜爽天天爽爽一区| 亚洲精品不卡一二三区| 青青草久草| HEYZO高无码国产精品227| 91天天日| 久久东京热成人| 少妇人妻太紧太深av| 五月天激情小说| 亚洲日本天堂| 日本中文字幕不卡视频| 中文字幕在线日亚洲9| 伊人丝袜美腿高跟在线观看高清| 亚洲性刺激| 成人aⅴ一区二区三区| 青青11操操操操操操操操| 丰满人妻一区| 国产女同视频在线播放| 麻豆天美国美国产| 视频在线97| 国产成人精品无码久久| 日日天天久久啊啊aaa| 超碰超碰超碰超碰的大鸡吧操黑丝袜| 成年人黄色小视频网站| 日本97久久| 久操网视频| 黄网站黄视频网站进入口 | 嗯嗯嗯嗯啊啊啊好紧好大| 九九九国产精品| 美國A片| 超碰1997| 人人玩人人添人人澡免费| 夜夜夜久久| 欧州91高潮| 婷婷综合视频| 国产白丝网站| 国产热RE99久久6国产精品首| 91超碰碰在线| 欧美日韩色综合网| 97久久久精品| 囯戸精品高潮呻吟旡码| 自拍盗摄一区| AAAA欧美日韩| 澳门成人网站久国产日韩| 国产精品乱码久久| 日韩人妻大香蕉| 婷婷激情四射| 久久久久久亚洲精品不卡人乳| 操久久久久| 超碰免费在线| 亚洲成人贴图| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 欧洲天天在线| 天天看天天日| 91日日| 翔田千里一区二区三区奶水| 91九九九逼| 乳欲人妻办公室奶水| 国产视频第2页| 黄色AAAAAAAAAAA大片| 午夜无码熟妇丰满人妻| 日韩精品永久在线观看| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 大香蕉综合网| 特级大荫道BBwBBwBBW| 国产男女边吃边摸视频网站| 色天堂综合| 1024人妻熟女一区二区三区| 3级毛片一二| 亚州色交| av一区二区三区四区| 激情综合网一盗摄| 欧美性爱精品一区二区| 欧美色图电影| 蜜臀人妻少妇久久在线观看| 午夜超爽| 伊人宅男大香蕉| 欧美专利1区2区3区4区5区免费| av一区二区三区四区| 2019午夜福利视频| 91久操| 精品高清av中文字幕| 狠狠爱AV| 天天综合在线4| 亚洲精品人妻在线| 亚洲性爱电影| 日韩本不卡视频在线观看 | www.黄色在线| 欧中美三级一区二区三区| 91久久久久久久久久久| 亚洲一区二区三区播放在线| 亚洲精品乱码久久久久久蜜桃麻豆 | 神马久久网| 五月天激情影院| 一级做a爰片性色毛片久久| 国产后入清纯| 亚洲天堂另类美腿| 国产精品自拍欧美在线| 麻豆久久精品亚洲精品88| 亚洲人久久久网| 操人妻少妇中文| 久热香蕉精品在线视频| 天天综合网91| 女上位精品在线| 熟妇人妻一区二区三区| 久久一区二区三区入口| 精品久久久av无码免费| 天堂av最新电影网| 久久视网78| 天天做天天爱天天爽| 国产精品一区二区校花| 美女91在线| 91碰碰| 人妻人人澡人人爽人人| 欧美有码激情视频一区二区三区| 久久国产热视频97电影| 色99999| www.人人摸在线视频| 日韩啪啪啪视频| 中日无幕一二三四区| 久9视频| 亚洲最新av无码成人精品区 | 综合网亚| 玖玖视频在线资源一区二区三区| 久久国内| 亚洲一区二区三区中文字幕| 中文字幕丰满子伦无码专区在线视频最新 | 欧美大片天天看| 亚洲欧美电影| 欧美韩日精品99综合| 欧美亚洲se91| 久久超碰亚洲人| 欧美嫩性色| 97福利视频| 国产日韩欧美三级片| 综合影视国产无码| 操迟操逼在巾线Fre看| 搡老熟女免费视频 | 人妻AV在线| 伊人女女资源在线观看| av强奸乱轮| 日本三级A片网站com| 精品日韩人妻视频| 国产午夜精品理论片a大结局| 欧美懂色综合网| 91爱啪| 97亚洲在线| 欧美天天干| 亚洲超碰97| 99无码狠狠久久| 狠狠操,使劲操| 人人弄人人摸| 熟女激情综合网| 婷婷在线视频在线观看| 久久久精品91八戒| 热久久国产| 国产精品干干干| 亚洲97久久精品亚洲| 亚洲欧美国产成人综合不卡| 日韩欧美午夜视频在线| 黄色av片三级三级三级免费看| 丁香五月综合| 丰满的三级少妇欧美久久久| 97婷婷色| 日韩天美| 在线97在线| 人妻内射一区二区在线视频| 久久久久人| 男女啊啊啊| 84YTCOM性无码|