【问题标题】:Enum class and template枚举类和模板
【发布时间】:2013-12-23 09:59:58
【问题描述】:

我有一些模板类

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

在那节课上我有枚举课。现在我想使用那个枚举。有没有办法在不专门模板(并且不添加默认 typename )的情况下解决该枚举。像这样:

CanvasDataBase::DrawType::Brush

我当然可以将枚举移出课堂。但是……

【问题讨论】:

  • 不是说你有结构,没有类,所以文字有些不一致。
  • @LaszloPapp 在 C++ 中,使用关键字class(默认访问控制为私有)或关键字struct(默认访问控制为公共)引入类。但在这两种情况下,它都是 C++ 术语中的一个类。
  • @LaszloPapp 按照标准,structclass关键字是class-keys。
  • @LaszloPapp 你很难意识到这个问题与类和结构之间的差异完全无关。您可以使用任何类键指定类型。
  • @LaszloPapp 我发现询问一个类并将其声明为结构非常一致,只要问题不是关于它们的差异。

标签: templates c++11 enums


【解决方案1】:

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

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

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

然后您可以使用CanvasDataDef::DrawType::BrushCanvasDataBase&lt;ConcreteType&gt;::DrawType::Brush 访问枚举器。

请注意,这实际上会改变原始版本的语义。在原始情况下,CanvasDataBase&lt;TypeA&gt;::DrawTypeCanvasDataBase&lt;TypeB&gt;::DrawType 是两种不同的类型,它们不能相互分配。基类将使它们都兼容。这可能符合也可能不符合您的要求。

【讨论】:

  • 我觉得这个是一样的,分别存储DrawType。即使没有继承。因为最后 - CanvasDataBase::DrawType::Brush。如果我们使用基类 - 这与单独存储它们相同。
  • @tower120:是的,最终我认为由于继承关系,它比单独存储更复杂。
  • 对不起 Angew,但我想要 - 只是简化语义。我想我会留下单独的 enum class 。抱歉花了时间。只是想知道有没有可能用这个做点什么。
  • @tower120: 顺便说一句,Bjarne 在他的新 C++11 书中明确写道,应避免将大量非模板化逻辑放入模板类中,因此我认为将其分开是合理的分别。如果我不忘记拿起书,我会在晚上尝试引用他的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多