gpt4 book ai didi

c++ - 使用专门用于分层类构造的模板

转载 作者:行者123 更新时间:2023-11-28 04:54:00 24 4
gpt4 key购买 nike

假设我们有一个名为 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 */

我创建了一个私有(private)基类,然后创建了两个版本的 DTOBase(非模板化的和模板化的),但我认为它有可能以更好的方式做到这一点,例如。使用 C++11 模板特化或类似的东西。

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

最佳答案

我个人会这样做:

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

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

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

以上具有明显的优势,即可以进行空碱基优化。没有成员的基类在许多编译器上进行了优化,不会增加对象大小。因此,您为“基本情况”获得的对象的成员与示例中的相同。

您还会得到某种程度上统一的表示。基本案例以 DTOBase<> 命名以及使用 DTOBase</*Some type*/>; 添加的额外功能

您可以调整 DTOBase 的布局通过特化DTOBaseExtraMembers .这可能会让您避免重复完全特化 DTOBase本身。

缺点是对象布局与您原来的布局不同。额外的成员可能会排在第一位。


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

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

如果您打算让它们存在于同一个命名空间中,则名称更改是强制性的。你不能有模板化的 DTOBase如果已经有一个非模板的。

关于c++ - 使用专门用于分层类构造的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47568503/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com