強盗型(スコープ)enum
(C++ 11、GCC内)で|=
演算子をどのようにオーバーロードできますか?スコープ付き列挙型でオーバーロードする方法= =演算子?
厳密に型指定された列挙型のビットをテストし、設定し、クリアする必要があります。なぜ強く型付けされるのですか?私の本はそれが良い習慣だと言っているからです。しかし、これは私がstatic_cast<int>
どこにでもなければならないことを意味します。これを防ぐために、|
と&
演算子をオーバーロードしますが、|=
演算子をenumにオーバーロードする方法を理解できませんクラスの場合は、単にthe operator definition in the classとしますが、構文的には機能しないような列挙型の場合は、
これは私がこれまで持っているものです。
enum class NumericType
{
None = 0,
PadWithZero = 0x01,
NegativeSign = 0x02,
PositiveSign = 0x04,
SpacePrefix = 0x08
};
inline NumericType operator |(NumericType a, NumericType b)
{
return static_cast<NumericType>(static_cast<int>(a) | static_cast<int>(b));
}
inline NumericType operator &(NumericType a, NumericType b)
{
return static_cast<NumericType>(static_cast<int>(a) & static_cast<int>(b));
}
私はこれを行う理由:これは強く型付けされたC#で動作する方法である:列挙型の基礎となるのフィールドを持つだけの構造体があります型とその上に定義された束の定数です。しかし、列挙型の隠しフィールドに収まる任意の整数値を持つことができます。
そして、C++のenumはまったく同じように動作するようです。どちらの言語でも、キャストはenumからintに、またはその逆にする必要があります。しかし、C#では、ビット単位の演算子はデフォルトでオーバーロードされていますが、C++ではオーバーロードされません。
これが意味をなさないかどうかはわかりません。個々の_bits_は列挙されていますが、 'PadWithZero | NegativeSign = 0x03'は有効な列挙定数ではありません。 – Useless
@Uselessこれは、 'printf'を実装するために使われたLinux 0.1で見つかったNUMERICTYPE_の定義のC++ 11バージョンに基づいた単なる例です。結果は元の列挙のメンバになっていますか?私はC#の背景から来て、スコープされた列挙型はC#のように動作することを期待しています。 – Virtlink
あなたの列挙型が '|'で閉じられていないと言っているので、その型の(不正な値)に強制するのは意味がありません。 _flagの定数values_を列挙しますが、flags_の_combinationをintにします。 – Useless