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

时间:2012-07-15 18:32:22

标签: c++ dynamic-cast

如何安全地转发(即在失败时返回null)到底层对象的确切类型,而不会导致dynamic_cast的性能损失,并且不必在我使用的每个类中都放置支持代码? / p>

1 个答案:

答案 0 :(得分:2)

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:78366879
这是5.6%的加速。这适用于非平凡的CPU绑定代码。 (它没有I / O)