避免使用dynamic_cast向下转换为原始类型

Avoiding dynamic_cast for downcasting to the original type

本文关键字:转换 原始 类型 cast dynamic      更新时间:2023-10-16

我如何安全地向下转换(即在失败时返回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:83024197
exact_cast:78366879
这是5.6%的加速。这是针对非琐碎的CPU绑定代码。(它不进行I/O)