避免使用dynamic_cast向下转换为原始类型
Avoiding dynamic_cast for downcasting to the original type
我如何安全地向下转换(即在失败时返回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
:83024197exact_cast
:78366879
这是5.6%的加速。这是针对非琐碎的CPU绑定代码。(它不进行I/O)
相关文章:
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 如何将唯一指针的 std::vector 转换为原始指针的 std::span?
- 如何在连接器 C++ 中将原始字节转换为字符串
- 将以 null 结尾的字节字符串转换为原始字符串文本
- Qt - 将空指针(原始数据)转换为 QImage 并将其显示在标签上
- 将 std::vector<int> 从原始内存转换为数组
- 原始指针在放置并推送到智能指针向量时是否会自动转换为智能指针?
- 在对原始字符串进行一些处理后返回(或转换)原始字符串
- 将多个非原始递归调用转换为迭代解决方案
- 将原始视频图像转换为VPX编码器的I420
- CAN模板类型推理考虑原始操作类型转换
- 为什么双转换到看似任何原始的常量参考
- C++ Arduino:向下转换后,子字段不引用原始地址
- 使用可变参数将函数转换回原始签名
- 将 std::conditional 与不可转换类型(原始与指针)一起使用
- 这个shared_ptr是如何自动转换为原始指针的
- 将原始像素数据转换为qpixmap
- 带有布尔转换的变量的原始打印:意外行为
- C++字符串管理通过字典匹配转换原始字符串
- Qt/C++-转换原始二进制数据并将其显示为图像(即QImage)