我知道你可以使用枚举的一部分作为函数的参数。我的问题是你可以使用整个枚举作为参数吗?
对于枚举:
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;
我想要的是将枚举的全名,值,所有内容作为参数传递。我想传递枚举以保持枚举名称和值继续使用它们。
答案 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。