使用模板专门用于分层类构造

时间:2017-11-30 07:58:54

标签: c++ c++11 templates

假设我们有一个名为DTOBase的类,其中包含一些声明,有时我需要DTOBase以及基于给定模板的额外声明,如下所示:

class DTOBase {
   /* DTOBase Declarations */
}

template<typename EntityType>
class DTOBase {
     /* DTO Base Declarations */
     /* Extra declarations for EntityType */
}

现在使用类:

DTOBase dto;
/* using with DTOBase members */


DTOBase<SomeEntity> dto;
/* using with DTOBase members and extra templated members */

我创建了一个私有基类,然后创建了两个版本的DTOBase(非模板化和模板化版本),但我认为它可以更好地实现它,例如。使用C ++ 11模板专业化或类似的东西。

是否可以声明一个模板化的类,它从非模板化版本继承成员?

1 个答案:

答案 0 :(得分:1)

就我个人而言,这样做:

template<class EntityType>
struct DTOBaseExtraMembers {
  // Additional members;
};

template<>
struct DTOBaseExtraMembers<void> {}; // Empty

template<typename EntityType = void>
class DTOBase : DTOBaseExtraMembers<EntityType> {
     /* DTO Base Declarations */
};

以上具有受空基优化影响的明显优势。没有成员的基类在许多编译器上进行了优化,无法添加到对象大小上。所以你得到的&#34;基础案例的对象的成员&#34;与你的例子中的相同。

你也会得到一些统一的表达。基本案例以DTOBase<>命名,额外的功能添加了DTOBase</*Some type*/>;

您可以通过专门化DTOBase来调整DTOBaseExtraMembers的布局。这样可以避免重复完全专注DTOBase本身。

缺点是对象布局与您原来的不同。额外的成员可能会先来。

但考虑到您对问题的评论。这可能是最简单的答案:

template<class Entity>
class DTODerived : public DTOBase  {
   //Extra stuff
};

如果您希望在同一名称空间中存在名称更改,则必须更改名称。如果已经存在非模板化的DTOBase,则无法使用模板{{1}}。