秘笈17 强制转换多态对象
试想一下,某个程序员设计了一个如下所示的可怕的接口(这是一个展示接口不良写法的很好的例子) :

我们的任务是编写一个吃香蕉的函数,如果传过来的东西不是香蕉(生吞鸽子是多么令人恶心!),抛出异常。如果对try_produce_banana()函数返回的一个值解引用,那么就有对一个空指针解引用的危险。
准备
这个秘笈需要C++的基础知识。
做法
因此,我们需要编写以下代码:

这很难看,不是吗? Boost.Conversion提供了一个稍微好一点的解决方案:

工作原理
boost::polymorphic_castfunction只是包装了第一个例子的代码,而这就够了。它检查输入是否为空,然后试图做一个动态转换。在这些操作中的任何错误都将抛出一个std::bad_cast异常。
还有更多
Boost.Conversion库还有一个polymorphic_downcast函数,它应该只用于将永远成功的向下转换。在调试模式(没有定义NDEBUG时),它会检查使用dynamic_cast向下转换是否正确。当定义了NDEBUG时,polymorphic_downcast函数将只做static_cast操作。这是一个很好的函数,它用于对性能要求严格的地方,同时还保留了调试编译时能够检测错误的功能。
参见
polymorphic_cast的最初想法是在Bjarne Stroustrup的《C++程序设计语言》(此书已由机械工业出版社引进出版)一书中提出的,请参考这本书获得更多的信息和不同主题的一些好想法。
官方文档也可能是有帮助的,可在http://www.boost.org/doc/libs/1_53_0/libs/conversion/cast.htm获得该文档。