在Alexandrescu的书中,有一段代码让我感到困惑。
template <template <class Created> class CreationPolicy>
class WidgetManager : public CreationPolicy<Widget>
{
...
};
据我所知,它可以在模板中告诉它一个模板类。所以我们接受“创建”#39;并将其设置为CreationPolicy类,然后从新创建的CreationPolicy类公开继承WidgetManager。这怎么可能呢?我在这里误解了什么?
答案 0 :(得分:1)
CreationPolicy是一个模板类,专门用于创建一些类。
WidgetManager派生自一个专门用于创建Widget对象的CreationPolicy(WidgetManager正在管理的东西)。
Widget的声明必须已经可供编译器使用。
WidgetManager也是一个模板类,专门用于CreationPolicy(它本身就是一个模板化的类)。
Alexandrescu所做的是将经理与创建对象的方式分开。他还将创建方法与正在创建和管理的对象分离。
所以你可以这样做:
WidgetManager&LT; MemoryCreator&GT; manager1 = ...;
WidgetManager&LT; FileSystemCreator&GT; manager2 = ...;
然后您可以向manager1或manager2询问Widget对象,而无需关心它们的创建方式。