让我给你一个例子来解释我想做什么(或者至少知道这是否可以做):

在Clang中,让我们学习一些基本的ValueDecl。正如您在提供的链接上看到的那样,此ValueDecl可以:

  • 成为简单的ValueDecl
  • 成为DeclaratorDecl
  • 成为EnumConstantDecl
  • 成为IndirectFieldDecl
  • 成为UnresolvedValueDecl

  • 我想知道,如果给定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

    08-19 15:56