gpt4 book ai didi

c++ - 如何 dynamic_cast 一个没有虚方法的类的指针?

转载 作者:搜寻专家 更新时间:2023-10-31 00:26:56 24 4
gpt4 key购买 nike

我正在使用 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 ... }

当然,如果您已经知道 vLoadInst ,你不需要检查 - 但一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com