我很困惑该类如何通过将自身作为模板参数传递而从RecursiveASTVisitor类继承。另外,是否在该行中写入Rewrite(R)

MyRecursiveASTVisitor(Rewriter &R) : Rewrite(R) { }


将值R分配给变量重写?在代码的任何地方都没有定义类Rewrite。除从类继承之外,“:”运算符是否用于其他用途?

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;
};

最佳答案

如所提到的注释,这称为Curiously Recurring Template Pattern。通常会实现此模式以提供类似于虚函数的机制,但是在编译时(静态多态性)。例如,RecursiveASTVistor<T>可能包含执行以下操作的方法:

...
//using T = MyRecursiveASTVisitor; for your specific case
T *concrete_visitor = static_cast<T*>(this);
concrete_visitor->VisitStmt(something);


如果在您的VisitStmt类中定义了MyRecursiveASTVisitor,则将调用该方法,否则它将调用RecursiveASTVistor提供的基本定义。您的类层次结构之外的调用者也可以利用这种静态多态性。

这是一个short example,可以帮助您更好地了解正在发生的事情:

#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


编辑:要回答您的其他问题:


  另外,是否在该行中写入Rewrite(R)
  MyRecursiveASTVisitor(Rewriter &R) : Rewrite(R) { }分配值
  R将变量重写?在任何地方都没有定义类重写
  在代码中。是“:”运算符用于继承以外的事情
  上课吗


RewriteMyRecursiveASTVisitor类的成员变量,并且是对Rewriter类型的对象的引用。在构造函数的定义中使用:运算符表示member initializer list。在这种情况下,我们只需使用传入的参数Rewrite初始化R变量。需要明确的是,MyRecursiveASTVisitor(Rewriter &R) : Rewrite(R) { }是类MyRecursiveASTVisitor的构造函数定义,而不是类定义。

关于c++ - 该类(class)的结构如何?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18896717/

10-09 22:48