【问题标题】:Policies and templates政策和模板
【发布时间】:2014-05-19 17:13:26
【问题描述】:

Alexandrescu 的书中有一段代码让我很困惑。

template <template <class Created> class CreationPolicy> 
class WidgetManager : public CreationPolicy<Widget> 
{ 
 ... 
};

据我所知,它是模板中的一个模板类。因此,我们接受“Created”并将其放入 CreationPolicy 类,然后从新创建的 CreationPolicy 类公开继承 WidgetManager。这怎么可能呢?这里有什么误解吗?

【问题讨论】:

  • 但是class Created 意味着它不应该只是class 吗? (在您发布的链接中,同一代码摘录中没有Created
  • 如果您声明一个小部件,代码会编译。内部模板指定 CreationPolicy 本身就是一个模板类。 Alexandrescu 试图做的是将创建策略(语义)与创建的实际对象分离。为什么你要在图书馆最深处以外的地方这样做是一个我没有很好答案的问题。
  • @VisViva 为模板模板参数指定“class Created”而不是“class”只是为了更好的文档(引用:“类似于函数声明中的正式参数名称”) - 参见 f.e. informit.com/articles/article.aspx?p=376878

标签: c++ templates policy


【解决方案1】:

CreationPolicy 是一个模板类,专门针对某个类 Created。

WidgetManager 派生自专门用于创建 Widget 对象(由 WidgetManager 管理的东西)的 CreationPolicy。

Widget 的声明必须已经可供编译器使用。

WidgetManager 也是一个模板类,专门用于 CreationPolicy(它本身就是一个模板类)。

Alexandrescu 所做的是将管理器与其创建对象的方式分离。他还将创建方式与正在创建和管理的对象解耦。

所以你可以这样做:

WidgetManager manager1 = ...;

WidgetManager manager2 = ...;

然后您可以向 manager1 或 manager2 询问 Widget 对象,而无需关心它们是如何创建的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2020-04-13
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多