如何安全地向下转型(即在失败时返回null)到底层对象的确切类型,而不会承担dynamic_cast的性能损失,并且不必在我使用的每个类中都放置支持代码?
如何安全地向下转型(即在失败时返回null)到底层对象的确切类型,而不会承担dynamic_cast的性能损失,并且不必在我使用的每个类中都放置支持代码?
dynamic_cast
会遍历整个继承树来查看您想要的转换是否可能。如果您只想要将对象直接向下转换为与其相同的类型,并且您不需要跨越虚拟继承进行转换,或者将对象转换为其实际类型的基类,则以下代码将起作用:
template<class To>
struct exact_cast
{
To result;
template<class From>
exact_cast(From* from)
{
if (typeid(typename std::remove_pointer<To>::type) == typeid(*from))
result = static_cast<To>(from);
else
result = 0;
}
operator To() const
{
return result;
}
};
Base* b = new Derived();
Derived* d = exact_cast<Derived*>(b);
编辑:我已经在我正在工作的项目上进行了测试。我使用QueryPerformanceCounter
得到的结果是:
dynamic_cast
:83,024,197
exact_cast
:78,366,879
这是一个5.6%的加速。这适用于非平凡的CPU绑定代码。(它不执行I/O操作)
dynamic_cast
更有效? - Oliver Charlesworth-Ofast
优化级别),该代码似乎比dynamic_cast
快了0.05秒,迭代次数为4,000,000次。 - Seth Carnegie
dynamic_cast
没有实现这个方法呢? - Konrad Rudolphdynamic_cast
更加强大。这本质上是一个特殊用例。 - Dan