c++模板代码顺序解析/CRTP
c++ template code order parsing/CRTP
有人能提示编译器如何处理等表达式吗
class DerivedA: public ParentTemplateClass<DerivedA>{
}
对我来说,它看起来像:
这个男孩的父亲是这个男孩的"儿子"
我的意思是,在不知道父类的确切"描述"的情况下,如何完成DerivedA类的"解析"对我来说并不明显。似乎不能。所以父类必须在子类之前处理,但在这种情况下,父类依赖于子类。。我被困在那里了。
是的,网上有一些文章描述了这种东西的用法,例如一篇关于奇怪重复模板模式的文章(http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern),但这不是某种标准或标准。必须有明确的行为描述,比如操作顺序,不是吗?
回答:谢谢大家。是的,向前倾斜的比喻对我来说似乎是合法的,可以停止损害我的大脑。模板对我来说仍然是最先进的,因为它隐藏着子语言的性质,我不能只是g++-E:)
在您的代码显示class DerivedA
之后,就声明了符号DerviedA
。此时,它可以用作模板参数。C++编译器会对代码进行多次传递,因此在解析时,编译器会"相信"您的意图是正确的,并且最终会得到该类的定义(当它即将实例化模板时,即您实际使用了该类型)。如果没有,它会在那时抱怨。如果您在声明中使用了前向声明的类,但在使用它之前没有提供定义,则会发生类似的情况
在实例化模板时,DerivedA
不完整;它已被声明,但未被完全定义。不完整类型可以用多种方式使用,例如,您可以声明对它们的指针或引用,将带有它们的函数声明为返回或参数类型,以及其他一些事情。您不能创建对象、继承对象、访问对象的成员,也不能做任何需要比类名更多信息的事情。
只要类模板只做这些事情,就没有问题。
我认为要理解这是如何工作的,你还需要更多地了解C++模板,而不仅仅是奇怪的递归模板模式。其他人可能比我更能回答这个问题,但我知道C++本身无法完全解析模板类定义。每次在代码中使用模板时,它都会实例化模板。如果每个类都在一个单独的包含文件中,可以这样想:
#include "ParentTemplateClass.h" // C++ initially validates the template class definition's syntax.
#include "DerivedA.h" // First use of ParentTemplateClass -
// at this point it becomes fully instantiated.
当C++解析器看到模板定义时,它将首先验证模板的语法。然后,当模板被用作DerivedA的基础时,解析将继续,模板将被完全实例化。当然,这是C++编译器将要做的解析的简化视图,我相信细节会因编译器而异。另请参阅http://womble.decadent.org.uk/c++/template faq.html#消除歧义.
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- 优先顺序:智能指针和类析构函数
- 在循环中按顺序遍历成员变量
- 独立读取-修改-写入顺序
- QML按钮点击功能执行顺序
- C++中数据类型修饰符的顺序
- 当比特(而不是字节)的顺序至关重要时的持久性
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 通过选项卡的文本设置QTabWidget顺序
- c++11评估顺序(未定义的行为)
- 如何在C++中递归地按相反顺序打印集合
- 给定顺序中的事件处理
- 具有包含其他对象的类的对象创建顺序
- 解析 CRTP 初始化顺序
- CRTP自动注册工厂(静态初始化顺序失败)
- c++模板代码顺序解析/CRTP