5 に答える
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);
コンパイルして問題なく実行されます。
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);
リンゴとバナナを交差させたときに何が得られるか見たいかどうかはわかりませんが...
ビット単位の演算の場合、式はプリミティブ型、つまりint
、long
などに評価されます。ただし、関数は非プリミティブ型(CEnumType
)を取ります。これを回避するために私が知っている唯一の方法は、式をキャストすることです。例えば:
do_something((CEnumType) (C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA));
CEnumType A;
A = (CEnumType)(A | C_ENUM_VALUE_APPLE);
こんな使い方もできます。
または-2つの列挙値を使用すると、無効な値が作成されます(0x3は列挙CEnumTypeにありません)。列挙はビットフィールドではありません。ビットフィールドが必要な場合は、1つ定義します。
強制的に値をキャストしたい場合は値をキャストできますが、列挙値のみを取得できることを期待しているコードを驚かせる可能性があります。
do_something((CEnumType)(C_ENUM_VALUE_APPLE | C_ENUM_VALUE_BANANA));