亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

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

C++類模板從入門到工程實(shí)踐:實(shí)例化、特化與常見陷阱 學(xué) C 的人幾乎沒有不碰類模板template的。STL 容器、智能指針、標(biāo)準(zhǔn)庫(kù)算法隨便拉一個(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)格能讓模板類長(zhǎng)期可維護(hù)”。無論你是剛學(xué)完類和對(duì)象、第一次看到 template 的初學(xué)者還是寫過一陣子模板卻總是被編譯錯(cuò)誤折騰的開發(fā)者都值得花十幾分鐘從頭過一遍。1. 類模板要解決的最原始痛點(diǎn)為類型寫同一份實(shí)現(xiàn)1.1 沒有模板時(shí)代復(fù)制粘貼帶來的是長(zhǎng)期的維護(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ā)”的長(zhǎng)期維護(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ū)別”的頻率非常高。簡(jiǎn)單說類模板是那個(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)景下可以直接簡(jiǎn)寫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í)只需看到類聲明。但類模板不能這么干。原因很簡(jiǎn)單編譯器在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通常用于庫(kù)內(nèi)部已知的熱點(diǎn)實(shí)例比如標(biāo)準(zhǔn)庫(kù)就大量用于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)簡(jiǎn)化了日常使用前面提過 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ī)制也能顯著簡(jiǎn)化展開代碼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 它至少?gòu)挠^賞性上會(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
返回資訊列表
99老司机精品视频在线观看| 久久XX| 亚洲AV成人精品网站在AV| 97亚洲色图| 亚洲中文字幕av| 欧美一级色| 久久精品中文字幕无码l| 黄片直播三级黄片两女一男| 成人精品在线观看| 人人摸人人干| 精品丰满熟妇人妻一区| 野狼福利社区| 国产69精品久久久久99尤物| 91久久久久免| 国产精品久久久久久久久久久久久久久久 | 婷婷色综合欧美日韩| 操婢日韩| 香蕉在线一区二区三区| 色99久草| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 日韩15p| 69国产对白刺激| 亚洲综合成人网| 欧美最婬乱婬爆婬性视频| 久久久久密臀一区二区| 色欲久久99国产精品久久久久久| 国产综合永久精品日韩鬼片| 成人热久久精品| 91青青草| 香港日本韩国人妇99www.wccm20| 久久久精品网| 亚洲日韩AV视色| 凹凸 69堂 在线播放| a片在线播放| 亚洲人精品久久久喷水| 中日韩免费看男女操逼大全| 精品视频123区小说区| 久久久性爱| 屌逼传媒| 91色色网站| 欧美亚洲清纯| 91老司机在线视频免费观看 | 亚洲一区日韩精品| 美欧老女人97| 射 色综合| 一本大道青青| 国内91熟女人妻丝袜天天精品视频在线 | 九九热超碰| 美女爽到高潮91| 天天干一干| 亚洲熟女av中文字幕| 精品国产乱码久久久久久影片| 国产亚州高清国产拍精| 网友自拍第一页| 黄色成品网站| 新版天堂中文资源8在线| www.91逼逼.com| 亚洲国产精品久久久男人的天堂| 狠狠干狠狠干| 黄色一区二区秘书性感| 中文字幕一二区二三区人妻专区| 色九九久九九| 国产女主播视频在线观看| 国产精品网址| 欧美日韩国产一区二区小黄片大全| 人妻无一区二区三区| 国产1727欧美| 人干人人人操人人摸| 啊啊啊啊好疼| 在线天堂资源亚洲| 丁香五月av| 久久精品人妻一区| 999 久久久| 中文字幕 国产区| 欧美牲| 精品成人女人久久| 日本欧美韩国日产片片在线看免| 91天天综合日韩欧美| 西西美女视频网| 色五月激情网| 丝袜美腿制服人妻二区中文字幕| 人妻夜夜爽天天爽三区麻豆AV网站| 躁躁日曰躁2020| 狠狠色丁香| blacked精品一区国产| 9久热这里只有精品| 欧美少妇高潮久久91| 黄页大片在线观看| 97香蕉碰碰人妻国产欧美| 成人乱人伦一区二区| 欧美91变态| 四虎免费视频| 另类成人首页一区| 亚洲情色在线| 中文字幕久久精品一区| 日韩人妻网站| 91狠狠综| 五月激情啪啪| 精品国产一区二区三区香蕉欧美| 爱丝福利| 好看的久久不射无码影视影院| 男女做爰猛烈动高潮A片免费应用 少妇厨房愉情理伦片bd在线观看 不卡中文字幕aⅴ在线 | 亚洲一区二区av| 蜜桃色院一区久久| 欧美日韩国产精品久久色婷婷| 六月丁操逼| 欧成人精品H无码| 天天看片青娱乐| 天美麻花大全视频| 超碰人人操97碰| 天天性射网| 国产精品久久久久久久久久二区三区| 超碰夫妻97| 96久久久精品| 超碰在线免费一区二区三区| 中文字幕一区二区无码成人 | 性一交一乱一交A片久久四色| 色五月天AV| 97国产精品国| 97色色色| 欧美黄色手机在线观看| 性影在线视频| 婷婷大香蕉| 亚洲午夜av| 一色网男人的天堂| 亚洲欧洲第二视频在线观看色图| 曰韩少妇无码| 国产乱子伦久久精品综合一区二区三| 精品无码久久久久久久杏吧| 国产东北女人在线视频| 丁香五月影院| 国产乱人妻精品入口| 美女黄页网站| 性久久久| 欧美天天拍| 蜜臀一二三| 99久久亚洲精品无码毛片潘甜甜 | 欧美一级久久久丰满| 亚洲精品美女久久久久久久久| 久久国产视频性吧| 精品二区三四区五电影| 91在线色综合| 日韩欧美大片免费高清啪啪| 亚洲欧美日韩制服另类| 欧美第一页| 日日超碰亚洲| 色色九区| 九九九久千久久激情蜜桃在线看| 国产成人亚洲精品无码最新在线| 美女淫穴| 欧洲综合视频| 久久免费少妇| WWW啪啪的com| 黄色污污污污污污网站| 91狠狠综合久久久久久| 色香欲天天天天综合色| 殴美性天天| 国产丝袜高跟美女av免费观看| 亚洲九区| 国产性爱在线视频一区二区| 日本午夜操逼| 夜夜欢天天干| 天天草天天干天天日| 一区二区三区蜜桃成人撸久久东京热 | 亚洲天堂中文字幕无码男同| 天天摸天天舔天天操| 日韩免费中文字幕视频| 91大学精品激情戏| 桑老女人九区| 色色婷| 国产成年女黄特黄| 一级黄色性爱A级片| 综合欧美日韩在线| 欧美性爱www免费版| 亚洲综合性网址| 一起草视频在线| 国产不卡精品91| 亚洲黄片免费在线播放| 伊人991| 午夜免费福利视频一区| 男人的天堂VA| 欧美激情欧美精品| 草莓精品视频| 五月天伊人| 午夜寂寞欧美| 高清无码人妻久久久一区二区三区aⅴ| 欧美日综合| 欧美人体性爱互联网第一页婷婷日本| 日本五十路在线| 精品久久久亚洲AV成人网站| 亚洲久久东京热一二三四五区视频| 欧美精品23| 99热这里都是精品| 国产精品美女久久久久久网站| 97国产高清视频在线观看| 国产三级日产三级韩国三级| 欧美日韩大黄片| 富女玩鸭子一级毛片| 呻吟 欧美 日本 中出| 亚洲蜜臀视频精品久久| 蜜桃臀 后入 一区 二区 三区 在线| 97在线免费| 免费操逼视频下载| 国产精品嫩草影院午夜两性| 精品99999| 激情网色| 岛国在线免费视频| 欧美巨大性舒爽顶到了| 亚洲成人ab| 亚洲精品天天影视综合网| 欧美亚洲第1页| 日韩无码服务区| 婷婷精品视频| JIZZJIZZ国产精品喷水| 人妻人人澡人人爽人人| 91精品人妻一区二区三区蜜桃臀| 99热精品在线| www.夜夜操| 综合网色| 欧美人妻色| 91处女在线观看| 国产精品久久泡妞网站| 精精夜夜| 岛国小电影| 超碰爽人妻熟女Av| 九九热免费在线国产视频伊人五月| 婷婷综合视频| 欧亚第一综合网| 久久曰曰| julia ann久久| 东北女人的毛片| 天天色怡春院| 精品少妇一区二区| 日韩三级伊人| 另类小说综合网| 精品国产无码中文| 国产粉嫩出水在线播放| 狼天天狼天天大香蕉| 综精品久久久aaaa| 精吧天堂| 色欧洲| 日本操逼视频不卡直接放| 岛国小电影| 国产色图乱伦| 国产精品亚洲色婷婷久久久| 欧美日韩国产高清在线一二三区| 欧美性爱一级操| 狠狠婷婷亚洲中文综合久久| 超碰97最新人妻| 超碰97久久| 日韩Va亚洲va欧美Ⅴa久久| 性色中出| 国产美女在线精品免费看| α√在线| 亚洲色图激情小说| 殴美性天天| 久久久精品中文字幕麻豆| 黄色十八禁网站| 最新精品久久蜜桃| 天天色综合天天操| 熟妇最新先锋一二三区| 大香蕉92| 91P0RNY大屁股人妻| 欧美一级国产一级| 91 国产丝袜在线放观看| 99这里有精品| 97网站在线观看| 精品中文字幕第一页| 激情自拍 校园春色| 97国产精品久久久久| a男人的天堂久久一级A毛片| 国产亚洲色婷婷久久99精品91| 吉川爱美亚洲二区在线| 亚洲日韩精品久久久久一区壹牛| 成功精品影院| 国产精品视频在线观看| 精品二区久久| 东北操逼| 逼逼逼逼操操操操操操操操操午夜剧场| 亚洲国产精品乱码在线观看| julia国产在线 | 99青青草国产视频| av天堂手机版追回| 1204人成网站色www| 约操熟妇| AV天堂因数| 国产精品久久久亚洲一区| 思思热国产高清| 国产又粗又长的视频| 欧美五区| 97人妻色| 精品国产AV一区天美传媒| 超97在线精品视频| 日韩不卡网操逼中文字幕日韩| 麻豆尤物视频网| 日本高清视频在线观看黄已三辽| 91九九九小逼| 99啪啪| 久久久久久久伊人精品| 无码国产精品96久久久久孕妇| 97超碰色中文字幕| 中文字幕国产| 人人妻人人爽一区二区三区| 欧美成年人性爱视频免费观看| 啊啊啊啊操死我| 老师充足的奶水小说| 91亚洲不卡一区| 曰韩av中文字幕专区| 蜜臀一区二区三区在线| 超碰在线人妻中文字幕| 亚洲丝袜二区| 久久婷婷一区二| 不卡九肏| 大粗鳼巴久久久久| 啊啊啊在线观看| 综合久久9| 亚洲性刺激| 伊人伊人LD| 欧美中文字幕一区| 99re这里只有精品3| 啊视频在线| 激情啪啪拍91| 欧美日韩第一页| 欧美一级黄片免费播放| 国产区性爱在线视频秋霞豆| av强奸乱轮| 蜜臀久久99精品久久久久| 天天操福利视频综合网站| 夜色97| 久久久成人精品| 人人摸人人舔一区二区| 热久久无毒不卡| 天天拍天| 欧美97色| 无遮挡男女激烈动态图| 黄色免费一级在线毛片| 九九久久一区二区伦理| 欧美一区二区观看在线| 天天爽天天操| www.99热在线只有精品| 91N综合网在线| 91色亚洲| 思思久热在线精品66| 8x福利精品第一福利视频导航| 一道α片欧美| 亚洲色欲天天人妻无码系列专区| 伊人AAA| 欧美精品 - 91爱爱| 九九热九九| 五月婷色| 秋霞影音一区二区三区| 加勒比在线观看一区二区| 久久黄黄黄| 欧美另类天堂| 欧美,亚洲,日韩,v,天堂,手机在线观看 | 永久免费发布性爱网| 亚欧性爱ab| 青娱乐蜜桃臀AV色婷| 欧美色图20P| 一摸二插三插| 久艹日日日| 人妻熟妇一区二区三区| 亚州色图片在线色| 大香蕉综合网| 久久日韩毛| 久久久久99999| 色婷婷影院| 天天综合青苹果| av影片在线观看不卡| 久久伊人青青草| 91精品在线播放| 日本免费中文字幕在线| 91大胆欧美| 中文 人妻 制服| 国内精品久久久久影院亚洲| 亚洲综合69| 欧美五十路熟| 日韩精品第3页| 日本羞羞的视频在线播放| 色五月网址| 青青草原av| 色情五月综合婷婷| 成人AV在线网站| 自偷自拍的亚洲视频| 一区超碰一区| 人妻少妇久久| 六十路日本| 色天堂在线观看| 八人操人人摸人人看| 俞拍自拍| 吻戏激情性巴克| 曰韩中文人妻视频| 亚码人妻| 色色五月天激情| 天天综合~91| 97精品一区二区视频在线观看| 亚洲人久久久网| 欧亚成人| 夜夜爽夜夜操| 蜜臀99999| 69精品久久久久中文字幕| 78精品在线| 亚洲熟妇乱女区二区三区| 久久精品国产99精品亚洲蜜...| 青木玲在线不卡| 骚女高跟AV在线| 黄色不卡视频| 国产一区在线看| 欧美特大黄一级片片免费| 2019午夜福利视频| 乱伦3P视频| 香蕉99秘 精品一区丁香| 爽 好舒服 无码刺激久久| 99精品无码| 性色av一区二区| 中文字幕一二三区| 日日日啊啊啊| 亚洲s在线观看| 日韩激情毛片一级久久久| 老司机久久| 精品国产精品一区二区| 91N欧美| 99热精品在线播放| 啊操爽品善一区二区三区| 后入式视频国产自| 伊人久久大香大香线蕉中文| 美女人妻色网站| 97在线视频网站| 激情综合av| 欧美劲爆第一页| 加勒比综合a∨| 久久精品中文字幕女同| 麻豆天美制片厂网站视频| 欧洲无码一区二区| 日韩国语字幕| 中文字暮97| 欧美亚洲国产自久久| 欧美日韩超碰在线| 69精品人人人人| 自拍视频大全亚洲专媒视频/一区二区三区 | 东北女人高潮视频| 99在线观看视频在线高清| 激情文学亚洲| 超碰国产精品无码| 亚洲夜色在线| 999久久久久久久精| 草b在线| 大香蕉伊人亚洲| 伊人991| 欧洲色综合| 91少妇高潮| 97情超碰色| 伊人加勒比| 免费的很黄很污的全部视频| 97色碰| 韩日性爱av| 日韩欧美女优电影| 啊啊啊好舒服好爽啊啊啊视频| 超碰日韩美妻| 日韩兔费看黄片| 懂色av色欲av蜜臀av| 五月婷婷激情综合| 91在线/欧洲| 日本一级特级毛片视频| 91N综合网在线| 伊人超碰97| 日韩不卡毛片Av免费高清| 韩国女主播青草在线| 狠狠操狠狠爱| 國產尤物AV尤物在線觀看| 欧美日韩中文视频播放| 精品乱码在线观看| 日韩三级天堂在线观看| 中文一区二区| av天堂影视中文在字幕在线中文 | 婷婷五月天成人网| 人妻丰满熟妇av无码区蜜桃| 成人一二| 99热在线播放| 老熟乱一区二区三区四区| 97av,com| 九区国产| 中文啪啪视频| 白嫩国模丰满一二三区| 成人AV素股で擦久久| 亚洲人人夜夜澡人人爽| 女沟厕偷窥piss小便| 91看黄片| 亚洲宗合电影| 天天综合网~91| AV大香蕉| 一区在线精品中文字幕| 97超碰国产精品| 精品久| 素人播放一区| 久久久涩| 蜜臀精品1区2区| 女人与公拘交酡2020视频| 日韩99神马视频播放| 人人玩人人添人人澡免费| 淫乱图区 | 国产女人成人精品视频| 99少妇| 久久色激情一区二区三区| 国产美女在线精品免费看| 久久女人视频| 成人性爱美曰韩| 五十路三区在线| 6080yy午夜理论三级一区二区三区无码| 九九九成人| 麻豆九九九| 国产乱子伦一区二区三区在线观看| 亚洲宅男天堂| av日韩在线观看电影| 激情欧美97| 人妻天天爽夜夜爽爽| 自拍视频一区在线观看| 97免费在线观看| 黑人精品久久97| 91丝袜在线观看视频在线观看| 一区二区三区亚洲| 葡萄牙性视频一二区| 91 亚洲 欧洲| 亚洲夜夜欢无码一区二区| 涩涩久久精品| 日韩一999精品| 91精品国产91久久青草| 亚洲中文字幕妇伦久久| 日韩精品9区| 婷婷av在线中文字幕| 亚洲情色1区| 日韩有码免费视频| 亚洲av热热色| 香蕉免费一区二区三区不读 | 综合色欧美| 国产亚洲日本| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | av大香蕉| 免费日韩黄片| 国产精品电影推荐| 久久欧洲| 素颜老阿姨乱情色| 大香蕉丝袜一级片| 日本黄 R色 成 人网站| 日韩乱伦影音先锋| 国产精品探花视频| 999国产精品999| 久久婷婷亚洲| 亚洲天天艹| 黄片不用下载在线观看| 亚洲成人免费在线| 丰满人妻一区二区三区在线| 综精品久久久aaaa| 性性久久| 漂亮人妻被强中文字幕hd| 伊色久人大在线| 精品人妻免费观看| 中文字幕日韩人妻视频一区二区三区| 久久三| 素人播放一区| 自拍盗摄一区| 精品一二三区女同| 久久超碰日韩精品| 校园春色美腿丝袜| 乱伦熟女专区| 99精品久久| 一区二区 电影 亚洲| 夜夜国自区| 亚州熟女乱伦| 爱我干综合| 97精品国产精品免费观看| 亚洲日精品| av绯色| 黑人粗大V S日韩女优视频| 国产成人免费观看在线视频| 色综合色色| 国产久久男人天堂| 一级片视频啪啪| 亚洲日本韩国在线| 久草久日| 中国东北熟女老太婆内谢| 亚洲AV无码黄色强奸| 极品丝袜无码| 精品视频久久久久九九九九9999 | 亚洲 欧美 日韩 国产一区二区| 日本色日夜干| 大香蕉综合在线| a久久| 夜夜躁狠狠躁日日躁av| 色婷婷五月综合激情中文字幕| 污电影在线观看| 欧美性巨大╳╳╳╳╳高跟鞋| 日本中文字幕高跟| 国产91精品福利在线| 欧美影音在线| 日本色色视频网站| 黄页18禁| 国产精品视频自拍在线| 欧美少妇熟女| 婷婷丁香成人| 狠狠爱大香蕉| 情色五月天网| 日日噜噜夜夜狠狠视频无| 久久久久久亚洲Av无码精| 日韩无码人妻| 少妇久久久久久久| 强奸抽插av| 亚洲精品国产精品乱码不卡| 操高情无码| 七久久久| 男人夜色天堂ss| 精品网站99999| 日韩人妻一二三区视频| 日韩成人人妻网站| 久久99热这里只频精品6学生| 日本国产二线女色| 五月天婷婷色| av最新免费中文字幕| 999九九九九国产动| 性色一线| 欧美一区二区观看在线| 久久精品女同亚洲女同13| 日韩AV一区二区三区四四| 国产操逼视频在线观看| 亚州综合色| 熟妇高潮精品一区二区三区下载| 丁香五月性爱| 丰满岳乱妇一区二区三区| 校园春色 亚洲| 亚洲区限制级| 亚洲欧美中日韩| 五月婷丁香| 日韩一级特黄av毛片| 亚洲日韩久久精品一区| 91人人| 蜜色网色哟哟| 人人乐大香蕉| 熟女性视频| 9色在线| 婷婷五月丁香五月| 91丨九色丨东北熟女| 色臀aV| 亚洲性少妇| 嗯嗯啊啊视频一区二区三区| 嗯嗯啊啊啊好舒服| 国产福利夜| 97欧美精品综合| 中文字幕91综合| 91是天天| 久久亚洲熟妇在线视频| 日本熟妇精品九九| 亚洲男人天堂视频| 91精品成人| 天天操美美| 亚洲情色无码一区二区三区| 国产农村妇女毛片精品久久| 超碰人妻久久人妻中文97| 国产强奸乱伦xd| 亚洲阿v天堂无码z2018| 男人天堂站| 亚洲AV噜噜狠狠网址蜜桃动漫| 蜜桃色院一区久久 | 亚洲精品啪视频| 色九九九九久| 色香伊人| 先锋音影AV| 天欧美在线| 精品亚洲成人免费在线| 亚洲天堂无码| 东北女人被操| 亚欧洲日韩国产精品| 国产一区二区在线播放| 久久一区二区蜜桃| 91被操| 久久亚洲AV无码专区首页| 日本久久超碰| 久久色一区| 天操天操夜操夜月月年年操操 | 日韩性爱播放| 精品人妻视频入口| 精品丰满熟妇人妻一区| www.91色综合| 操逼免费视频无码国产| 国产成年女人免费视频播放a| 在线观看色视频| 日韩亚洲欧美中文字幕| 天美传媒av一区二区| 亞洲久久直播| 久久久久国产精品喷潮免费观看臀| 精品少妇后入一区二区三区四区人妻巨乳| 91AV入口| 色五月亚洲| 日本五区不卡| 色色色色电影网| 日本免费一区二区不卡 | 亚洲欧美黄| 一本大道不卡一二三区| 青青草久久一区网| 九九九九精品九九九九| 五月婷婷六月激情| 精品人妻丰满熟妇一区二区三| 93人人操人人| 天天搞欧美| 91干熟女| 欧美视频一区二区三区| 精品-91人妻子系列| 性色高清..……| 色婷婷狠狠18禁| 亚洲精品97| 日本天天操| 色欧美在线| 日韩中字av一区| 亚州Av天美传媒| 中文字幕啊啊啊在线观看视频| 午夜亚洲| 久久久久久中文版| 人人干人人操人人..com| 色综合大香蕉| a人欧美综合天堂麻豆| 暴力av在线| 欧美毛片在线网| 黑人狂躁日本妞一区二区三区| 操死我了啊啊啊| 成人夜夜爽| 色综合av男人天堂| 熟妇视频一区二区三区在线| 丝袜综合色图| 五月婷丁香| 国产精品久久久久久照片| 欧美国产操逼| 久草婷婷| 亚洲欧美大| 亚洲国产精品成人无码久久久| 97日韩| 久久精品一区二区三区蜜桃臀| 美腿色图| 小草精彩毛片| 午夜精品探花| 在线观看黄色电话| 1240青青草一区二区三区视频天爱| 视频一区二区免费在线| 亚洲天堂一区| 天美传媒国产原创中文字幕亚洲欧美另类 | 亚洲日韩资源| av网站免费线看| 久久男人精品| 欧美久久伊人| 另类在线| 手机午夜电影神马久久| 九九九精品一区二区无码| 国产精品久久久视频| 国产亲戚伦亲在线| 极品尤物自安慰| 后入式999| 男人的天堂在线| 久久久久久久久久久久久久久久9 亚洲成人妻日韩在线 | 午夜九九| Julia Annxxxxx| 牛牛AV人人夜夜澡人人爽| 久久激情网| 国产大学生口爆吞精合集| 亚洲欧洲综合成人av一区| 东京热大香焦| 国产操逼网站亚洲一级黄色| 亚洲精品国产av天美传媒| 九九热AV| 亚洲1区2区三区高清中文字幕| 偷拍2020| 日韩久久.一级黄色片| 久久久久网站-538在线视频-欧美永久乱码| 久久久新亚洲AV| 呦呦影院| 欧美老妇曰批的视频| 制服少妇欧美| 自拍大香蕉乱插| 黄色电影在线播放综合网站| 欧美真人抽搐一进一出gif| 伊人伊人LD| 五月天婷婷欧美三区| 日本三级A片网站com| 97干97色| 日韩av在线精品观看| 中文熟女五十乱码在线| 婷婷AV一区二区三区| 国产熟女自拍| 强乱老妇中文字幕| 自怕偷自怕亚洲精品| 探花激情视频| 亚洲欧洲久久天堂| 国产一国产一级毛片古装| 免费精品中文字幕| 亚洲另类综合欧美| 四虎免费视频| 亚洲国产婷婷在线播放| 亚洲AV乱码专区国产噜噜亚洲| 日本 情色 1区2区3区| 欧洲亚洲国产综合在线| 欧美精品另类人妖xxxx| 老熟女阿 国产91| 丁香五月综合| 熟妇人妻一区二区三区| 夜夜爽夜夜高潮夜夜爽| 欧美后入| 亚洲免费精品一区| 国产女大学生AV| 色综合潮| 东北少妇高潮zzzz| 另类亚洲图色| 无码人妻精品一区二区中文| 亚州乱码中文字幕综合久久久| 亚洲综合影院| 激情五月天色色网| 久久岛国| 欧美高潮在线| 国产亚洲精品美女久久久m| 密臀在线免费观看| 翔田千里一区二区三区奶水| 色欲色香天天天综合网www-亚洲综合国| 曰韩人妻中文字幕在线| 国产九九久久久精品| 亚洲无码免费看| 97视频在线免费| 一区二区三区日韩欧美| 中文高清一区二区的| 成人小说另类在线| 国产污视频麻豆传媒一区二区 | 91AV天堂| 丁香五月成人| 亚洲精品国产日韩无码AV永久免| 国产外初女出血视频| 2025亚洲男人天堂| 激情小说五月天| 操逼逼中文字幕| 88在线一区二区三区| 91色碰| 亚洲第一成人影院色播| 97超碰人人模人人拍人人| 久九9精品| 日韩啪啪啪视频| 色婷婷五月天| a在线视频免费观看| 色色色日本| 乱伦1色页| 亚洲18禁| 色淫网站优优视频| 国产操逼逼网| 国产婷婷一区| 春色91| 欧美色九九| 午夜寂寞欧美| 97色论| 国产精品国产| 另类欧美色| 亚洲综合贴图91 | 天天爱天天操| 国产性久久久| 无码精品人妻一区二区三区妖精| 在线看的av| 尤物黄色在线观看网站| 成年女人黄网站| 18禁的网站在线| 日韩极品无码B| 大香蕉视频啪啪啪啪| 中文字幕女同在线| 久久一区二区三区四区五区| 风月影院男女十八禁| 男人天堂站| 男人的午夜天堂| 在线观看岛国有码| 中文字幕性感少妇av| 91AV天堂| 人妻中文字幕日韩电影| 亚洲影视第一页| 日本99热| 懂色aV一区二区天美传媒| 综合网,亚洲,欧美| 操婢日韩| 久久一二三四五六七八九区| 国产无套粉嫩白浆在| 久久精品熟妇丰满人妻99| 青青国产精品在线| 69视频入口| 色偷综合| 五月香婷婷| 天堂亚洲精品久久老牛| 桃花色涩综合影院| 不卡日本一区二区| 97天天爽| 大香网站| 欧美少妇色图| 9997se| 亚洲成av人片色午夜乱码| 久久丝袜| 无码操逼天堂| 91N欧美| AV麻豆免费一区| 精品免费成人久久| 99国产精品在线观看| 久久一区二区高清免费| 欧美牲| 成年女人一区| 黄在线| 色香欲影| 久草精品视频| 中文字幕在线观看丝袜| 亚洲欧美在线观看无码| 亚洲精品人体| 国产精品熟妇一区二区三| 国产精品女同| 亚洲精品亚洲人成在线麻豆| 91人妻熟女| 久久9免费视频| 国产夜夜艹| 在线观看国产黄色| 51久久夜色精品国产麻豆| 日天天九九天堂666| 97免费免费视频网| 亚洲少妇色| 美中日韩无码| 天天躁日日躁AAAAXXXX国产 | 丝袜美腿制服人妻二区中文字幕| 97这里只有精品| 学生妹天天看| 精品视频专区| 美女淫穴| 校园春色制服丝袜中文字亚洲| 免费在线黄片视频| 八戒无码国产午夜福利| 啊啊啊操死我| 超碰色大香蕉| 91美女看B| 中文字幕88av在线| 神马久久久久眼| 99热啪啪| 久热香蕉精品在线视频| 国产日韩精品无码去免费专区国产| 男人的天堂久久| 99热在线只有精品| 91高跟美女在线播放| 蜜臀精品1区2区| 欧美综合站| 啊啊啊啊嗯嗯嗯用力好爽| 女人被添高潮免费视频| 成人午夜小视频手机在线看| 亚欧成人一级片在线播放| #NAME?| 亚洲成人AB| 大香蕉日韩| 精品少妇一区二区| 亚洲无限观看| 操老熟女AV| 97chaopenrihan| 新怡红院| 午夜噜噜噜| 伊人精品国产| 色九九九九九九| 人妻 欧美 中文| 久久久久亚洲一区女同性恋中文字幕| 九九热在线精品视频| 麻豆AV短剧| 久久偷偷色综合蜜桃| 操淫穴亚洲五月丁香 | 久久久久久人体| 78m啪啪啪| yw尤物av无码点击进入麻豆| 少妇熟女1区2区3区| 婷婷av在线中文字幕| 日韩欧美aⅴ综合网站发布| 性在久久久久久| 91久久久久久| 日韩三级久久久| 精品免费1| 久久综合久色欧美综合狠狠 | 亚洲国产ⅴ高清在线观看| 色在线亚洲视频www| 日韩乱插| 亚洲丝袜色| oumeizonghese,www| 97在线资源| 九九九九精品在线| 国产在线综合福利网站| 国产精品毛片?v一区二区三区| 看日韩操逼| 91无人区卡一卡二卡三乱码入口最新版:能让用户有更多选择的选择-经典说说-爱 | 久碰视频| 本道在线| 奶水 人妻 哺乳 在线| 成人av福利在线观看| 粉嫩不卡一区二区性爱| 男人的天堂在线有码| 国产女同性恋视频| 欧美日日人人天天| 乱伦一二三| 乱伦日本色图AⅤ| 天天操天天射青青草| 97操在线| 日韩人人精品| 国产亚洲性生活视频播放| 日本性爱少妇| 伊人丝袜美腿高跟在线观看高清| 亚州大图综合色图| 日本高清免费一本视频在线观看| 999亚洲国产视频| 青草视频在线看看看看看看看看看| 抽插爽| 蜜臀久久99精品久久久久久| 国产精品一级毛片不卡视| 久久久久久国产精品| 老汉网| 国内毛片欧美香蕉精品| 竹菊影视国产一区二区| 亚洲淫色网中文| 三四中文字幕| 极品极品色影院| 好看的91视频| 超碰碰97资源站| 无码抄逼网| 中文字幕天天操| 欧洲在线性爱视频| www.99在线| KK色在线影院| 久久精品日韩| 久99视频| 亚洲在线A| 欧美黄色大片在线观看| 涩爱AV在线| 亚洲狠| 裸体美女免费看网站青草| 福利在线视频一区二区| 99久久99久久免费精品蜜臀| 久久久夜夜嗨免费视频| 亚州色国| 久久精品国产亚洲AV高清演员表| 女优视频第10页| 麻豆成人AV| 强奸乱亚洲| 四虎免费在线播放| 国产无马视频| 欧美日韩大陆黑人少妇99| av一区二区三区不卡| 大香蕉亚洲中文| 丰满人妻-区二区三区免费看| 国产美女高潮叫床视频| 不卡六六在线91| 中国一区二区亚洲人妻| 午夜精品久久久99热蜜桃的功能特点 | 久久91| 992这里有精品| 日本在线伊人啪啪| 立川理惠加勒比无码| 麻豆一区二区三区在线看| 色成人Www精品永久观看| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师 | 国产suv精品一区二区四区999| 99少妇| 五月婷婷啪啪| 久久超碰97| 久久精品视-一级做a爰片性色毛片16美国-中国女与老外在线精品 | 日本超碰97日韩精品人妻| 国产特级毛片AAAAAA高潮流水 | 亚洲97综| 夜夜狼人妻| 国产深夜福利| 精品国产72| 伊人久久综合影院| 中文字幕无码不卡啪啪| 91精品久久综合熟女| 97伊人网| 亚洲天堂另类美腿| 国产毛片毛片4p懂色| 97色97好| 国模无码一区二区三区在线| 亚州Av天美传媒| 婷婷五月天成人| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 中文字幕久久亚州无码| 免费强奸av| 在线中文AV| 国产aⅴ无码片毛片一级网站| 久湿久久| 99热最新网址| 日韩亚洲欧美中文字幕| 欧美日动态视频| 天堂8在线新版官网| 婷婷婷婷婷婷久久久久| 欧美色图天堂网m| 一级A片女人高潮叫床| 超碰97日韩| 欧美亚洲美少妇一区二区| 欧美系列在线一区二区| 色图综合网| 91爱看| 黄页大片在线观看| 国产女同视频在线播放| 色约约一区=区三区| 大香蕉手机在线视频| 看黄片视频免费| 精品人妻av区天天看片| 啊啊啊久久久视频| 五月丁香在线| 精品久久久久av影院| 亚洲综合有码| 精品人妻一区二区三区视频| av资源在线播放天堂| 韩国毛片一区二区三区| 欧美日韩人人精品| 国产精品呦一区二区三区| 日日骚AV| 色香91| 久久水蜜臀亚洲AV无码精品| 黄色网址在线免费观看| 人人么人人操| …中文字幕亚洲乱,97人妻无码费视…| ,国产乱人伦精品一区二区三区| 精品国产久热在线观看| 免费家庭乱伦视频| 熟妇色99| 久久久久久久久久久久久女过产乱-少妇高潮一区二区三区喷水-成人AV | 天天视频黄| 国产97色在线 | 亚洲| 久久99999| 亚洲午夜免费狠狠干| 大香蕉丝袜一级片| 人妻丰满熟妇一区二区三| 超碰成人人人爽人人爽| 熟妇人妻一二三区免费| 激情五月天色色| 亚洲图片欧美制度| 亚洲综合成人网| 国语国产操逼伊人AV网| 精品九九| 大香蕉淫人网| 色天使AV天堂| 亚洲人人夜夜澡人人爽| 亚洲永久AV无码精品秋霞| 啊好大好舒服| 天天天天干| 欧美日韩成人在线| 国产成人欧美精品在线| 超碰色图| 综合自拍| 亚洲无码一区成人免费午夜| 欧美色997| 区二区亚洲婷| 性爱欧美五月| 一二三四视频在线社区中文字幕| 女生自91网站| 精品无码人妻一区二区免费蜜桃| 久久精品72| 九九九久久久久| 欧美亚州综合图片| www.男人天堂| 啊啊啊在线看| 亚洲欧美激情小说| 啊啊啊啊好疼| 白丝一区| 懂色aV一区二区天美传媒| 中文?日韩?免费?精品| 啊啊啊啊嗯嗯在线久久久| 熟妇一区二区|