- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 llvm库,我想检查 llvm::Value * 是否实际上是 llvm::LoadInst *(llvm::LoadInst 继承自 llvm::Value)。
但遗憾的是,llvm::Value 不包含任何虚方法! (是的,即使没有虚拟析构函数)是否可以在没有虚拟方法的类上使用 dynamic_cast
,或者是否有任何其他方法来进行类型检查?
最佳答案
在 LLVM 中,有一个 llvm::dyn_cast<T>
这将使用 LLVM 的内部构造动态地从一种类型转换为另一种类型,只要它们确实是有效的转换——如果你使用了错误的类型 T
, 它将返回 nullptr
.
所以像这样:
llvm::Value *v = ... some code here ...
...
llvm::LoadInst* li = llvm::dyn_cast<llvm::LoadInst>(v);
if (!li) { ... not a LoadInst, do whatever you should do here ... }
else { ... use li ... }
当然,如果您已经知道 v
是 LoadInst
,你不需要检查 - 但一个 assert(li && "Expected a LoadInst");
如果你弄错了,你会发现的。
请注意,您不使用 T*
对于 llvm::dyn_cast<T>
,就像你对 C++ 标准一样 dynamic_cast
.
llvm::Value
代码中的注释解释说没有 vtable 正是出于这个原因 (http://www.llvm.org/doxygen/Value_8h_source.html#l00207)
/// Value's destructor should be virtual by design, but that would require
/// that Value and all of its subclasses have a vtable that effectively
/// duplicates the information in the value ID. As a size optimization, the
/// destructor has been protected, and the caller should manually call
/// deleteValue.
~Value(); // Use deleteValue() to delete a generic Value.
关于c++ - 如何 dynamic_cast 一个没有虚方法的类的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50733757/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!