这个类是如何构造的
How is this class constructed?
我很困惑该类如何通过将自身作为模板参数传递来继承类 RecursiveASTVisitor 。另外,是否在行
中写入重写(R)
MyRecursiveASTVisitor(Rewriter &R) : Rewrite(R) { }
将值 R 分配给变量重写?代码中任何地方都没有定义类重写。":" 运算符是否用于从类继承以外的其他内容?
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;
};
它被称为奇怪的重复模板模式。当编译器创建RecursiveASTVisitor<MyRecursiveASTVisitor>
它知道MyRecursiveASTVisitor
的布局时,所以一切都没问题。
您可以在维基百科上阅读更多信息
正如评论所提到的,这被称为奇怪的重复模板模式。此模式通常用于提供类似于虚函数的机制,但在编译时(静态多态性)。例如,RecursiveASTVistor<T>
可能包含执行以下操作的方法:
...
//using T = MyRecursiveASTVisitor; for your specific case
T *concrete_visitor = static_cast<T*>(this);
concrete_visitor->VisitStmt(something);
如果在 MyRecursiveASTVisitor
类中定义了 VisitStmt
,则调用该方法,否则调用 RecursiveASTVistor
提供的基本定义。类层次结构之外的调用方也可以利用这种静态多态性。
这里有一个简短的例子,可以帮助你更好地了解正在发生的事情:
#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
编辑:要回答您的其他问题:
另外,是否在行中写入重写(R)
MyRecursiveASTVisitor(Rewriter &R) : Rewrite(R) { }
分配值 R 到变量重写?任何地方都没有定义类重写 在代码中。":"运算符是否用于继承以外的其他内容 来自班级?
Rewrite
是 MyRecursiveASTVisitor
类的成员变量,是对类型 Rewriter
的对象的引用。:
运算符在构造函数的定义中用于表示成员初始值设定项列表。在这种情况下,我们只需使用传入的参数 R
初始化 Rewrite
变量。需要明确的是,MyRecursiveASTVisitor(Rewriter &R) : Rewrite(R) { }
是类MyRecursiveASTVisitor
的构造函数定义,它不是类定义。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 从持续时间构造std::chrono::system_clock::time_point
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 构造对象的歧义
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 如何修复函数样式强制转换或类型构造的预期"("?
- 双重列表复制构造函数:与单一列表复制构造函数有何不同
- 缺少复制构造函数与对象切片有何关系