什么是动态铸造的一些“很好用”的例子?
我们经常听到/读到应该避免动态投射。 根据你的看法,我想知道什么是“好用”的例子?
编辑:
是的,我知道另一个线程:当我读到我问的第一个答案时,确实是这样。
最近的这个线索给出了一个它派生出来的例子。 有一个基本的Shape类和从它派生的类Circle和Rectangle。 在测试平等时,很显然Circle不能等于Rectangle,试图比较它们将是一场灾难。 在遍历指向Shapes的指针集合时,dynamic_cast会执行双重任务,告诉您这些形状是否可比,并为您提供适当的对象以进行比较。
向量迭代器不可取消
这是我经常做的事情,虽然不太好,但它很简单而且有用。
我经常使用实现接口的模板容器,想象一下
template<class T>
class MyVector : public ContainerInterface
...
ContainerInterface具有基本的有用内容,但仅此而已。 如果我想在不暴露我的模板实现的情况下对整数向量进行特定算法,那么在实现中接受接口对象并将其dynamic_cast接受到MyVector是非常有用的。 例:
// function prototype (public API, in the header file)
void ProcessVector( ContainerInterface& vecIfce );
// function implementation (private, in the .cpp file)
void ProcessVector( ContainerInterface& vecIfce)
{
MyVector<int>& vecInt = dynamic_cast<MyVector<int> >(vecIfce);
// the cast throws bad_cast in case of error but you could use a
// more complex method to choose which low-level implementation
// to use, basically rolling by hand your own polymorphism.
// Process a vector of integers
...
}
我可以将一个Process()方法添加到ContainerInterface中,该方法将被多态地解析,这将是一个更好的OOP方法,但我有时更喜欢这样做。 当你有简单的容器,很多算法,并且你想隐藏你的实现时,dynamic_cast提供了一个简单和丑陋的解决方案。
你也可以看看双重派遣技巧。
HTH
我目前的玩具项目使用dynamic_cast两次; 曾经为解决缺乏C ++中的多次调度(这是一个访问者风格的系统,可以使用多个调度来代替dynamic_casts),并且一次用于特殊情况下特定的子类型。
在我看来,这两个都是可以接受的,尽管前者至少源于语言赤字。 事实上,我认为这可能是一种常见的情况; 大多数dynamic_casts(以及大量的“设计模式”)是针对特定语言缺陷的解决方法,而不是针对某些特定语言缺陷的解决方案。
链接地址: http://www.djcxy.com/p/28437.html