作者poyenc (发箍)
看板C_and_CPP
标题Re: [问题] 大家常常说的wrapper到底是什麽?
时间Sat Sep 21 18:45:24 2019
※ 引述《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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1569062731.A.266.html
1F:推 KevinR:09/22 11:37
※ 编辑: poyenc (223.141.37.92 台湾), 09/22/2019 14:09:37
2F:推 CoNsTaR: 加 wrapper 只会变具体不会变抽象吧 09/26 20:22