c++ - 避免 dynamic_cast 向下转换为原始类型

标签 c++ 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 绑定(bind)代码。 (它没有 I/O)

关于c++ - 避免 dynamic_cast 向下转换为原始类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11494524/

相关文章:

c++ - 如何使用 dynamic_cast 正确向下转换?

c++ - dynamic_cast 导致 bad_cast 错误

c++ - 如何在没有 nvcc 的情况下在编译时获取 CUDA 工具包版本?

c++ - 在 OpenCV 中播放 AVI 文件

.net - 真实世界 strtod();用于 WINAPI 文本框

c++ - 为什么不建议在头文件中定义宏?

c++ - C++ 中的 Dynamic_Cast

c++ - C++ 中 dynamic_cast 的真实示例

尽管对象是派生类型,但 C++ dynamic_cast 返回 NULL

c++ - 如何设置 XAudio2 dll 版本