假设我们有一个名为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模板专业化或类似的东西。
是否可以声明一个模板化的类,它从非模板化版本继承成员?
答案 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}}。