C++:CRTP,传入继承

文章来自微信公众号“科文路”,欢迎关注、互动。转发须注明出处。

由于名称 CRTP 没啥内涵也不好记,我这里就称其为“传入继承”吧。“传入”可以助记 CR TP,也指代需要把自身传进父类。

MLIR 中使用 C++ 定义新的 Op 时,就避不开 CRTP (Curiously Recurring Template Pattern) 这么个神奇的 C++ 设计模式。

比如下面这段代码

1
2
3
4
5
6
7
class ConstantOp : 
public mlir::Op<
ConstantOp,
mlir::OpTrait::ZeroOperands,
mlir::OpTrait::OneResult,
mlir::OpTraits::OneTypedResult<TensorType>::Impl> {
...

可以看到,我们需要定义的 ConstantOp 出现在了右侧父类的模板参数列表中。果然 curiously enough (神奇)。

这里借用 cppreference 的例子一起学习一下这个需要把自身交代给父类的继承方式,由于原始名称 CRTP (奇异递归模板模式)没啥内涵也不好记,我这里就称其为“传入继承”吧。“传入”可以助记 CR TP,也指代需要把自身传进父类。

Read more