5

我怎样才能安全地向下转换(即在失败时返回 null)到底层对象的确切类型,而不会导致性能损失dynamic_cast,并且不必在我使用的每个类中放置支持代码?

4

1 回答 1

4

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)

于 2012-07-15T18:32:21.770 回答