13
4

5 に答える 5

23

C ++ではsを列挙型にキャストする必要がありますが、カスタム演算子intでキャストを非表示にすることができます。OR

CEnumType operator|(CEnumType lhs, CEnumType rhs) {
    return (CEnumType) ((int)lhs| (int)rhs);
}

この演算子を使用すると、オリジナルを書くことができます

do_something(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA);

コンパイルして問題なく実行されます。

于 2012-04-26T18:20:34.500 に答える
6

C ++には、列挙型に関してCより​​も厳しいルールがあります。呼び出すときは、値を列挙型にキャストする必要があります。

do_something((CEnumType)(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA));

intまたは、呼び出すたびにキャストを記述したくない場合は、キャストを実行するラッパー関数を作成できます。

void do_something_wrapper(int types)
{
    do_something((CEnumType)types);
}
...
do_something_wrapper(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA);

リンゴとバナナを交差させたときに何が得られるか見たいかどうかはわかりませんが...

于 2012-04-26T18:18:59.850 に答える
5

ビット単位の演算の場合、式はプリミティブ型、つまりintlongなどに評価されます。ただし、関数は非プリミティブ型(CEnumType)を取ります。これを回避するために私が知っている唯一の方法は、式をキャストすることです。例えば:

do_something((CEnumType) (C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA));
于 2012-04-26T18:20:19.583 に答える
1

CEnumType A;

A = (CEnumType)(A | C_ENUM_VALUE_APPLE);

こんな使い方もできます。

于 2013-10-30T01:54:38.023 に答える
0

または-2つの列挙値を使用すると、無効な値が作成されます(0x3は列挙CEnumTypeにありません)。列挙はビットフィールドではありません。ビットフィールドが必要な場合は、1つ定義します。

強制的に値をキャストしたい場合は値をキャストできますが、列挙値のみを取得できることを期待しているコードを驚かせる可能性があります。

do_something((CEnumType)(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA));
于 2012-04-26T18:18:38.213 に答える