Come è possibile sovraccaricare l'operatore |=
su un valore di tipo (in C++ 11, GCC) fortemente codificato?Come sovraccaricare | = operatore su enumerato ambito?
Voglio testare, impostare e cancellare i bit su enum fortemente digitati. Perché fortemente digitato? Perché i miei libri dicono che è una buona pratica. Ma questo significa che devo static_cast<int>
ovunque. Per evitare ciò, sovraccarico gli operatori |
e &
, ma non riesco a capire come sovraccaricare l'operatore |=
su un enum. Per una lezione, devi semplicemente inserire the operator definition in the class, ma per le enumerazioni che non sembrano funzionare sintatticamente.
Questo è quello che ho finora:
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));
}
La ragione per cui faccio questo: questo è il modo in cui funziona nel fortemente tipizzato C#: un enum c'è solo una struttura con un campo del suo sottostante tipo e un gruppo di costanti definito su di esso. Ma può avere qualsiasi valore intero che si adatti al campo nascosto dell'enumerazione.
E sembra che le enumerazioni C++ funzionino nello stesso modo. In entrambe le lingue, i cast devono passare da enum a int o viceversa. Tuttavia, in C# gli operatori bit a bit sono sovraccaricati per impostazione predefinita e in C++ non lo sono.
Non sono sicuro che questo abbia senso. I singoli _bit_ sono enumerati, ma 'PadWithZero | NegativeSign = 0x03' che è _non_ una costante enumerata valida. – Useless
@Useless Sì, è solo un esempio basato su una versione C++ 11 di una sequenza di NUMERICTYPE_ definisce trovata in Linux 0.1 usata per implementare 'printf'. Il risultato deve essere un membro dell'enumerazione originale? Vengo da uno sfondo C# e le enfasi con scope previste si comportano come quelle in C#. – Virtlink
Sto dicendo che il tuo tipo enumerato non è chiuso sotto '|', quindi non ha senso costringerlo in un (valore illegale di) quel tipo. Enumera i valori di _flag constant_, ma lascia che una _combination di flags_ sia un int. – Useless