1、利用 重载方法: val.getDefiningOp<emitc::CallOpaqueOp>() 和 val.getDefiningOp()
class Value { private: Operation* definingOp_ = nullptr; public: Operation* getDefiningOp() const { // 基础版本 return definingOp_; } template <typename OpTy> // 模板版本 - 调用基础版本,增加类型检查 OpTy getDefiningOp() const { return llvm::dyn_cast_or_null<OpTy>(getDefiningOp()); } };
2、动态多态 (dyn_cast) 要求具有相同的基类。当没有相同基类时候可以使用requires (C++20)
模版类变量 可以使用 dyn_cast<BAUStructuredOp>(*op) 直接类型转换,也可以Operation* operation = op隐式类型转换
3、利用模版template <typename... OpType>实现多个同类算子处理
template <typename... OpTypes>
static void registerMAUOps(RewritePatternSet &patterns) {
(patterns.add<InsertDataLayoutforBAUByInterface<OpTypes>>(patterns.getContext()), ...);
}