【发布时间】:2020-07-23 21:06:46
【问题描述】:
我已经阅读了很多关于 Curiously Recurring Template Pattern 的帖子,但我仍然不明白为什么我不想使用它而不是仅仅使用模板编程。
以下是维基百科稍作修改的示例:
template <class T>
struct Base
{
void interface()
{
static_cast<T*>(this)->implementation();
}
};
struct Derived : Base<Derived>
{
void implementation();
};
但是,我可以用更直接的方式对模板做同样的事情:
template <class T>
struct OuterClass
{
void interface()
{
nested->implementation();
}
private:
T* nested;
};
struct NestedClass
{
void implementation();
};
OuterClass<NestedClass> x;
x.interface();
CRTP 与我的实施相比有什么优势?
编辑:T* nested; 作为成员变量的行也可以只是T nested;,这样nested 是由外部类的构造函数创建的。
【问题讨论】:
-
我能想到的最简单的答案是,在后一种情况下,使用该接口的开发人员需要知道类型是如何组合的——他们必须明确地说
OuterClass<NestedClass>。在 CRTP 案例中,尤其是私有继承,这是他们不必知道的细节。旁注:在第二个示例中,OuterClass<T>::nested未初始化。 -
什么提供“T* 嵌套”?
-
@Klaus 它总是可以由默认构造函数提供
-
@cdhowie 对于你提出的第一点,我可以使用 typedef 来解决这个问题。