Templates 枚举类和模板

Templates 枚举类和模板,templates,c++11,enums,Templates,C++11,Enums,我有一些模板类 template<typename ProgramBufferAttr> struct CanvasDataBase{ enum class DrawType {Brush, Attr, AttrInst}; } 我当然可以把enum移出课堂。但是…假设枚举独立于模板参数,则可以创建定义枚举的非模板基类,并从该基类派生类模板: struct CanvasDataDef { enum class DrawType { Brush, Attr, AttrIns

我有一些模板类

template<typename ProgramBufferAttr>
struct CanvasDataBase{
   enum class DrawType {Brush, Attr, AttrInst};
}

我当然可以把enum移出课堂。但是…

假设枚举独立于模板参数,则可以创建定义枚举的非模板基类,并从该基类派生类模板:

struct CanvasDataDef {
  enum class DrawType { Brush, Attr, AttrInst };
};

template <typename ProgramBufferAttr>
struct CanvasDataBase : CanvasDataDef {
  //...
};
struct CanvasDataDef{
枚举类DrawType{Brush,Attr,AttrInst};
};
模板
结构CanvasDataBase:CanvasDataDef{
//...
};
然后,您可以作为
CanvasDataDef::DrawType::Brush
CanvasDataBase::DrawType::Brush
访问枚举数


注意,这实际上会改变原始版本的语义。在原始情况下,
CanvasDataBase::DrawType
CanvasDataBase::DrawType
是两种不同的类型,不能相互分配。基类将使它们都兼容。这可能是或可能不匹配您想要的。< /P>不是您有结构,不是类,所以文本有点不一致。@ C++中的LaszloPapp,使用关键字<代码>类< /C>(默认访问控制是私有的)或关键字<代码>结构> <代码>(默认访问控制为公共)。但在这两种情况下,它都是C++术语中的一个类。@ LASZLopApp按照标准, Stult和类< /Cord>关键字是“代码>类键< /COD> S.@ LaszloPapp,您所难以实现的是,该问题与类和结构之间的差异完全无关。您可以使用任何类键指定类型。@LaszloPapp我发现询问一个类并将其声明为struct是相当一致的,只要问题不在于它们之间的差异。我认为这与单独存储DrawType是一样的。即使没有继承权。因为最后-CanvasDataBase::DrawType::Brush。如果我们使用基类-这与单独存储它们是一样的。@tower120:是的,最终我认为由于继承的原因,它甚至比单独存储更复杂。抱歉,Angew,但是我想要-只是简化语义。我想我将继续使用单独的枚举类。抱歉耽误了你的时间。我只是想知道有没有可能用这个做点什么。@tower120:btw,比亚恩在他的新C++11书中明确写道,应该避免在模板类中放入太多非模板逻辑,所以我认为单独使用它是合理的。如果我不忘拿起那本书,我会尽量在晚上引用他的话。
struct CanvasDataDef {
  enum class DrawType { Brush, Attr, AttrInst };
};

template <typename ProgramBufferAttr>
struct CanvasDataBase : CanvasDataDef {
  //...
};