Re: [問題] 大家常常說的wrapper到底是什麼?

作者: poyenc (髮箍)   2019-09-21 18:45:24
※ 引述《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 的前提
下讓我們開發時減少很多不小心造成的錯誤.
作者: CoNsTaR ((const *))   2019-09-26 20:22:00
加 wrapper 只會變具體不會變抽象吧

Links booklink

Contact Us: admin [ a t ] ucptt.com