gpt4 book ai didi

c++ - 为什么 Curiously Recurring Template Pattern (CRTP) 有效

转载 作者:太空狗 更新时间:2023-10-29 21:11:45 24 4
gpt4 key购买 nike

我遇到了很多关于 CRTP 是什么的解释,但没有解释它为什么起作用。

The Microsoft Implementation of CRTP in ATL was independently discovered, also in 1995 by Jan Falkin who accidentally derived a base class from a derived class. Christian Beaumont, first saw Jan's code and initially thought it couldn't possibly compile in the Microsoft compiler available at the time. Following this revelation that it did indeed did work, Christian based the entire ATL and WTL design on this mistake.

例如,

 template< typename T >
class Base
{
...
};

class Derived : public Base< Derived >
{
...
};

我了解为什么以及何时可以使用它。但我想知道编译器是如何以这种方式工作的。因为在我看来,由于无休止的递归,它不应该工作:class Derived继承自 Base< Derived > , 其中Derived是继承自 Base< Derived > 的类, 其中Derived ...等等。

能否请您从编译器的角度逐步解释它是如何工作的?

最佳答案

递归定义的类型并不少见:链表也是递归的。它之所以有效,是因为在循环的某个时刻,您不需要类型是完整的,您只需要知道它的名称。

struct LinkedNode {
int data;
LinkedNode *next; // Look ma, no problem
};

对于 CRTP,这一点就在这里:

Base<Derived>

Derived 实例化 Base 确实 要求 Derived 是完整的,只知道它是一个类类型。即,以下工作正常:

template <class>
struct Foo { };

struct Undefined;

Foo<Undefined> myFoo;

因此,只要 Base 的定义不需要 Derived 是完整的,一切都可以正常工作。

关于c++ - 为什么 Curiously Recurring Template Pattern (CRTP) 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49708984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com