让我给你一个例子来解释我想做什么(或者至少知道这是否可以做):
在Clang中,让我们学习一些基本的ValueDecl。正如您在提供的链接上看到的那样,此ValueDecl
可以:
ValueDecl
我想知道,如果给定
ValueDecl *
,我是否可以确定它是上面列出的类之一,还是我必须绑定(bind)到这个ValueDecl *
?每个类中都有bool classof()方法,但我不了解此方法的目的。可以解决我的问题吗?
最佳答案
classof
确实是解决方案的一部分,但是通常不打算直接使用。
相反,您应该使用 isa<>
, cast<>
and dyn_cast<>
templates。 LLVM程序员手册中的示例:
static bool isLoopInvariant(const Value *V, const Loop *L) {
if (isa<Constant>(V) || isa<Argument>(V) || isa<GlobalValue>(V))
return true;
// Otherwise, it must be an instruction...
return !L->contains(cast<Instruction>(V)->getParent());
}
cast<>
和dyn_cast<>
之间的区别在于,前者断言实例是否可以强制转换,而前者仅返回空指针。注意:
cast<>
和dyn_cast<>
不允许使用null参数,如果参数可以为null,则可以使用cast_or_null<>
和dyn_cast_or_null<>
。要进一步了解没有
virtual
方法的多态设计,请参阅How is LLVM isa<>
implemented,您会注意到它在后台使用了classof
。