boost 的Conversion库

包含4个函数:

polymorphic_cast
polymorphic_downcast
numeric_cast
lexical_cast

与C++风格转型的区别:它们明确无误地表达了程序员的意图

polymorphic_cast

             boost 的Conversion库_第1张图片

dynamic_cast的这种对指针和引用类型的不同行为:

指针---- 转型失败---空指针

引用-----转型失败----异常

问题:容易忘记测试指针是否为空

解决:polymorphic_cast

特点:

1】 转型失败时总是抛出一个std::bad_cast异常。

2】  它是一个函数,必要时可以被重载

使得代码更清晰,类型转换也更少错误

3】 仅针对指针的向下转型和交叉转型没有针对引用类型的版本

向下转型:从基类向派生类的向下转型

交叉转型:即从一个基类到另一个基类。

好处:不需要测试空指针,失败时总抛出异常,也不会把错误传播到函数以外。

使用dynamic_cast-----测试指针的有效性

derived*p=dynamic_cast<derived*>(p1)

if(!p)

{...}

使用场合:

当(指针)转型失败被认为是异常时polymorphic_cast比dynamic_cast更能清晰地表明代码的意图;

对引用类型执行多态转型时,仍然使用dynamic_cast

polymorphic_cast 的基本原理

对dynamic_cast的简单包装(返回的指针为空,就抛出异常)

仅仅对指针进行向下/交叉转型

    boost 的Conversion库_第2张图片


 ————————————————————————————————————————————————————————

polymorphic_downcast

原因:有时dynamic_cast被认为太过低效:需要额外的运行时间

为了避免这些代价,常常会诱使你使用static_cast, 它没有这些性能代价

办法:

为了确保用static_cast进行向下转型是安全的,你必须确保对每次要执行的转型进行测试

原理

step1:用dynamic_cast进行了转型的测试;

step2:然后它就使用static_cast去执行转型。

           boost 的Conversion库_第3张图片

场合:

如果向下转型真的是必须的,并且被证实是性能的瓶颈polymorphic_downcast就是你需要的。

好处:提升它带来的性能,获得static_cast的速度

——————————————————————————————————————————————————————

numeric_cast

原因:整数类型间的转换经常会产生意外的结果。

从较大的类型(例如long)向较小的类型(例如short)赋值,有可能数值过大或过小而不能被目标类型所表示

原来:出现莫名其妙的数字,引起未定义或令人惊讶的行为

现在:抛出bad_numeric_cast异常

numeric_cast可以确保转换是有效的、合法的,否则就不允许转换。

但:

numeric_cast不能帮助我们在浮点数间的转换中避免精度的损失。

————————————————————————————————————————————————————————————-

lexical_cast 文字转换

自定义类型进行文字转换时需要满足

1,源类型必须是可流输出的(OutputStreamable)

而目标类型必须是可流输入的 (InputStreamable)。,

2.两种类型都必须是可复制构造的(CopyConstructible),

并且目标类型还要是可缺省构造的 (DefaultConstructible)和可赋值的

(Assignable)。

可流输出(OutputStreamable)意味着存在一个为该类型定义的 operator<<

可流输入InputStreamable)则要求有一个 operator>>

对于许多类型,包括所有内建类型和标准库中的字符串类型,这个条件都满足

std::string s="42";

  inti=boost::lexical_cast<int>(s);

以下情况时使用 lexical_cast:

●    

从字符串类型到数值类型的转换

●    

从数值类型到字符串类型的转换

●    

你的 自定义类型所支持的所有字面转换

你可能感兴趣的:(boost 的Conversion库)