C++ 这个类是如何构造的?

C++ 这个类是如何构造的?,c++,C++,我对类如何通过将自身作为模板参数传递而从类RecursiveASTVisitor继承感到困惑。另外,写重写器是否符合要求 将值R赋给变量Rewrite?代码中任何地方都没有定义类重写。:运算符是否用于继承类以外的其他对象 它被称为奇怪的重复模板模式。当编译器创建RecursiveASTVisitor时,它知道MyRecursiveASTVisitor的布局,所以一切正常 您可以阅读更多关于的评论,这被称为。此模式通常被实现为提供类似于虚拟函数的机制,但在编译时是静态多态的。例如,Recursiv

我对类如何通过将自身作为模板参数传递而从类RecursiveASTVisitor继承感到困惑。另外,写重写器是否符合要求

将值R赋给变量Rewrite?代码中任何地方都没有定义类重写。:运算符是否用于继承类以外的其他对象


它被称为奇怪的重复模板模式。当编译器创建RecursiveASTVisitor时,它知道MyRecursiveASTVisitor的布局,所以一切正常


您可以阅读更多关于

的评论,这被称为。此模式通常被实现为提供类似于虚拟函数的机制,但在编译时是静态多态的。例如,RecursiveASTVistor可能包含执行以下操作的方法:

...
//using T = MyRecursiveASTVisitor; for your specific case
T *concrete_visitor = static_cast<T*>(this);
concrete_visitor->VisitStmt(something);
输出 编辑:回答您的其他问题:

另外,写重写器是否符合要求 MyRecursiveASTVisitorRewriter&R:重写器{}指定值 R到变量重写?任何地方都没有定义类重写 在代码中。:运算符是否用于继承以外的其他操作 来自一个班级

Rewrite是MyRecursiveASTVisitor类的成员变量,是对Rewriter类型对象的引用。在构造函数的定义中使用:运算符来表示。在本例中,我们只需使用传入的参数R初始化重写变量。更清楚的是,MyRecursiveASTVisitorRewriter&R:RewriteR{}是类MyRecursiveASTVisitor的构造函数定义,而不是类定义


阅读Google for CRTP奇怪地重复出现的模板模式,你可能会发现一些关于这项技术的好介绍。我更新了我对你的补充问题的答案。您可能会混淆类的定义和类的构造函数的定义。
class MyRecursiveASTVisitor
    : public RecursiveASTVisitor<MyRecursiveASTVisitor>
{

 public:
  MyRecursiveASTVisitor(Rewriter &R) : Rewrite(R) { }
  void InstrumentStmt(Stmt *s);
  bool VisitStmt(Stmt *s);
  bool VisitUnaryOperator(UnaryOperator *e);

  Rewriter &Rewrite;
};
...
//using T = MyRecursiveASTVisitor; for your specific case
T *concrete_visitor = static_cast<T*>(this);
concrete_visitor->VisitStmt(something);
#include <iostream> 

template <class T>
struct Base {
    void foo() {
        T *concrete = static_cast<T*>(this);
        concrete->foo();
    };
    void bar() {std::cout << "Base" << std::endl; }
};

struct Derived : public Base<Derived> {
    void foo() {std::cout << "Derived" << std::endl;}
};

int main() {
    Base<Derived> b;
    b.foo();
    b.bar();
}
Derived
Base