【问题标题】:Can I use a generic enum type as a parameter of a function?我可以使用泛型枚举类型作为函数的参数吗?
【发布时间】:2019-10-07 15:52:09
【问题描述】:

我想将参数传递给一个函数,它是一个枚举。但是我创建了许多不同的枚举,所以我希望该函数对所有枚举都有用。是否可以?我想做的是这样的:

enum Enum a {one, two};
enum Enum b {red, white};

void useEnum (enum anyEnum){
    //do something
}

【问题讨论】:

  • 一切皆有可能,但一如既往地取决于细节。 //do something 是什么?
  • 做一个泛型函数,这里有什么问题?
  • 您听说过我们的领主和技能:模板吗?
  • 在您的示例中,onered 的值可能相同——您的函数应该如何处理?
  • ... 或者您可以使用int 或任何其他整数类型,它可以保存所有枚举的所有值(最好是std::common_type<std::underlying_type<a>, std::underlying_type<b>>,但int 在大多数情况下就足够了例)

标签: c++ enums parameters


【解决方案1】:

您可以通过将函数设为模板来使函数接受您喜欢的任何类型:

enum Enum a {one, two};
enum Enum b {red, white};

template <typename EnumType>
void useEnum (EnumType anyEnum){
    //do something
}

但是,我强烈怀疑编写一个处理数字和颜色的函数是否是个好主意。在不知道更多上下文的情况下,我宁愿使用重载甚至更明确:

void useNumber(a number){}
void useColor(b color){}

PS:如果您对不同的枚举使用一个函数,那么请注意,您基本上是倒退了一步。枚举的主要目的是拥有类型安全的枚举(enum class 增加了更多的类型安全性),而在您的 useEnum 内部,两个枚举的唯一共同点是它们具有具有基础值 0 和 @987654326 的元素@ 这就是你将要做的事情。在这一点上,与使用原始 01 相比,使用枚举没有更多优势。

【讨论】:

  • 谢谢,这正是我想要的。这些名称只是示例。
  • @verlsk 不要错过刚刚添加的 PS,如果您愿意,当然可以接受答案 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2016-10-28
相关资源
最近更新 更多