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