是否可以将整个枚举集作为参数传递?

时间:2012-10-27 00:01:51

标签: c++ enums

我知道你可以使用枚举的一部分作为函数的参数。我的问题是你可以使用整个枚举作为参数吗?

对于枚举:

enum exampleEnum {ONE,TWO,THREE}

部分枚举我指的是:

function example(exampleEnum value){}

function example(ONE);
整个枚举

是:

function example(enum value){}

function example(exampleEnum);

我想我要问的是我可以传递一个枚举,就像你传递一个数组一样。至少这就是我想的问题。

修改

我想要实现的效果是在多个类和子类之间共享一个枚举,而不是在我希望使用它的每个类/子类中重新定义它。我希望传递这些值而不是使用某种形式的全局变量

修改编辑

更具体一点......我使用枚举值作为关联数组的形式。

enum attribute{STR,DEX,CON,INT,WIS,CHA};
short int charAttributes[6];

charAttributes[STR] = sumValue;
charAttributes[DEX] = sumValue;
charAttributes[CON] = sumValue;
charAttributes[INT] = sumValue;
charAttributes[WIS] = sumValue;
charAttributes[CHA] = sumValue;

我想要的是将枚举的全名,值,所有内容作为参数传递。我想传递枚举以保持枚举名称和值继续使用它们。

5 个答案:

答案 0 :(得分:4)

exampleEnum是一个类型,而不是一个值。 将类型传递给函数的C ++方法是使用模板:

#include <iostream>
#include <ostream>
#include <typeinfo>
using namespace std;

enum exampleEnum {ONE,TWO,THREE};

template<typename T>
void example()
{
    cout << typeid(T).name() << endl;
}

int main()
{
    example<exampleEnum>();
    return 0;
}

答案 1 :(得分:1)

  

我想要实现的效果是在多个类和子类之间共享一个枚举,而不是在我希望使用它的每个类/子类中重新定义它。我希望传递这些值而不是使用某种形式的全局变量。

嗯,你不必重新定义它。只需将枚举定义放在这些类之外。当你想在某个类中使用枚举值时,只需包含带有该枚举的标题。

enum exampleEnum {ONE,TWO,THREE};

class Class1
{
   void foo()
   {
       exampleEnum t=TWO; // use enum values here
   }
};

class Class2
{
   void bar()
   {
       exampleEnum t=ONE; // and here
   }
};

class Class3
{
   void some()
   {
       exampleEnum t=THREE; // and even here
   }
};

修改

  

通过这样做,我会向我的类添加一个依赖项,我试图避免。给班级一些东西然后让班级拿东西更好。虽然我无法完全摆脱依赖关系,但我希望自己能够这样做。

在这种情况下,您可以使用模板:

enum exampleEnum {ONE,TWO,THREE};
enum exampleEnumOther {RAZ,DVA,TRI};

template<typename Enum>
class Class1
{
   Enum member;
public:
   void foo(Enum p)
   {
       member=p;
   }
   template<typename OtherEnum>
   void bar(OtherEnum val)
   {
        OtherEnum use=val;
   }
};

int main()
{
    Class1<exampleEnum> t;
    t.foo(ONE);
    t.bar(TWO);
    t.bar(RAZ);
}

Class1不依赖于任何特定的枚举。

答案 2 :(得分:0)

如果您正确构建了枚举值,则可以将值与|按位or运算符组合在一起。

enum exampleEnum {One=0x01, TWO=0x02, THREE=0x04, FOUR=0x08}; // one bit set in each

example(ONE | TWO | FOUR);

在您的功能中,您需要单独测试每个值:

if (value & ONE) // ONE was passed
if (value & TWO) // TWO was passed, etc.

答案 3 :(得分:0)

您可以设置template <typename T> example并在几个不同的枚举上对其进行专门化,这样您就可以拨打example(ONE)来调用特定于exampleEnum的代码,然后(给出,enum otherEnum { EINS, ZWEI, DREI }您可以致电example(EINS)以获取特定于otherEnum的代码。

答案 4 :(得分:0)

如果你的枚举是连续的(或者,如果你从未在枚举的定义中使用=),那么很容易做到的就是迭代枚举。

从这开始:

enum Bob
{
  BeginBob,
  ONE = BeginBob, // the first entry needs an = Begin clause.
  TWO,
  THREE,
  EndBob
};

现在,您可以以与传递迭代器范围相似的方式传入一系列枚举值。

void doWork( Bob b );
void doWork( Bob begin, Bob end )
{
  for (Bob i = begin; i != end; ++i )
    doWork( i );
}

开始和结束枚举值描述半开放范围,就像迭代器一样。所以你可以在整个枚举范围上调用doWork,如下所示:

void doWork( BeginBob, EndBob );

或者,您可以在所有内容上进行调用,但不包括,如下所示:

void doWork( BeginBob, THREE );

在ONE和TWO上调用doWork。