看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《OfficeGL (妤欣)》之銘言: : 網路上查詢好久,可能我不是本科系的關係 : 很難理解這個是什麼? : 不知道是不是所謂的ADT概念呢 : 還是就單純API的意思? : 這邊開始好抽象 : 先謝謝大家了~ 前面幾位大大提過的就不再贅述了. 簡單說透過間接的方式去存取 函式/物件時, 這個中間層都可以稱作wrapper, 但中間層不僅僅只 是為了套接或抽象化而存在, 有時是為了加入更多編譯時期檢查 ( 這也是寫 C++ 的好處之一). 舉個 C++ Core Guidelines 的項目 ES.46 為例: ES.46: Avoid lossy (narrowing, truncating) arithmetic conversions https://bit.ly/2lZ3qYH 對於項目中提到 double 到 int 的轉換 (narrowing conversion) , 如果只是呼叫建構子是不會報錯的, 目前只有透過 list initialization 語法才可能讓編譯器幫我們抓到錯誤: int i = 1.5; // bad but without warning int i2{2.5}; // okay, compiler gives a warning 其實不只是 double 轉換成 int, double 轉 float, unsigned 轉 int 也有可能造成數值損失, 這些都可以額外透過 wrapper 來做 檢查. 首先我們需要有能夠判斷是不是 narrowing conversion 的 type traits, 簡單用 std::common_type 實作如下: type traits is_narrowing_conversion https://bit.ly/2m0h8dO 再來就是新增函式模版並透過它來賦值, 搭配 std::is_convertible 就可以用 SFINAE (Substitution Failure Is Not An Error) 幫我們擋掉 narrowing conversion: example https://bit.ly/2kLQt4e 如果需要被初始化/賦值的型別本身沒有支援這樣的檢查, 用 ADL (Argument-dependent lookup) 搭配 tag 也可以很好地做擴充, 而這個 wrapper 甚至可以在沒有增加 runtime overhead 的前提 下讓我們開發時減少很多不小心造成的錯誤. -- P1389R0: Guidelines for Teaching C++ to Beginners https://bit.ly/2GvDWKb SG20 Education and Recommended Videos for Teaching C++ https://www.cjdb.com.au/sg20-and-videos -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.141.37.92 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1569062731.A.266.html
KevinR:09/22 11:37
※ 編輯: poyenc (223.141.37.92 臺灣), 09/22/2019 14:09:37
CoNsTaR: 加 wrapper 只會變具體不會變抽象吧 09/26 20:22