3

列挙型の一部を関数のパラメーターとして使用できることは承知しています。私が持っている質問は、列挙型全体をパラメーターとして使用できますか?

列挙型の場合:

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;

私が望んでいるのは、列挙型全体の名前、値、すべてをパラメーターとして渡すことです。列挙を渡して、列挙の名前と値をそのまま使用し続けるようにしたいと考えています。

4

5 に答える 5

5

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;
}
于 2012-10-27T00:17:05.613 に答える
1

列挙型が連続している場合(または、列挙型の定義で=を使用したことがない場合)、列挙型を反復処理するのが簡単なトリックです。

これから始めましょう:

enum /*class*/ Bob // class optional
{
  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=ststic_cast<Bob>(i+1) )
    doWork( i );
}

開始と終了の列挙値は、イテレータのように、半分開いた範囲を表します。したがって、次のように列挙範囲全体でdoWorkを呼び出すことができます。

void doWork( BeginBob, EndBob );

または、次のように3つまでのすべてで呼び出すことができますが、これは含まれません。

void doWork( BeginBob, THREE );

これは、1つと2つでdoWorkを呼び出します。

于 2012-10-27T00:18:35.130 に答える
1

列挙型の値を適切に構成すると、値を|ビット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.
于 2012-10-27T00:13:48.050 に答える
1

私が達成しようとしている効果は、列挙型を使用したいすべてのクラス/サブクラスで再定義せずに、複数のクラスとサブクラスで列挙型を共有することです。これらの値は、何らかの形式のグローバル変数を使用する代わりに渡されます。

うーん、再定義する必要はありません。これらのクラスの外に enum 定義を配置するだけです。また、一部のクラスで列挙型の値を使用する場合は、その列挙型にヘッダーを含めるだけです。

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 は特定の列挙型に依存しません。

于 2012-10-27T02:31:21.437 に答える
0

template <typename T> exampleいくつかの異なる列挙型でそれを作成して特殊化することができ、example(ONE)に固有のコードを呼び出すために呼び出すことができますexampleEnum(たとえば、に固有のコードを取得するためにenum otherEnum { EINS, ZWEI, DREI }呼び出すことができます。example(EINS)otherEnum

于 2012-10-27T00:17:46.293 に答える