Domanda

Ho una miscela di classi C ++, alcune delle quali memorizzano una variabile di stato 0..9 come intero, altri usano '0' ... '9'. Attualmente lo faccio:

enum { kOne = '1' };
class StoresValueAsInt {
    static int value;  // contains 0 ... 9
};
class StoresValueAsChar {
    static char value; // contains '0' ... '9'
};
class StoresValueAsChar {
    static char value;
};

template <typename X>
isOne() { return X::value == kOne; }

Questo mi permette di scrivere il codice buggy isOne<StoresValueAsInt::value>(). Invece, vorrei che il compilatore si lamenti di questo utilizzo errato. Ho provato quanto segue:

enum ValueInt {
    kOne = 1
};
enum ValueChar {
    kOne = '1'
};

class StoresValueAsInt {
    static ValueInt value;
};
class StoresValueAsChar {
    static ValueChar value;
};
class StoresValueAsChar2 {
    static ValueChar value;
};

Tuttavia, questo non funziona, perché Kone è visibile a livello dello spazio dei nomi e quindi ha dichiarazioni contrastanti di Kone.

C'è un modo per non far dichiarare gli Enums nello spazio dei nomi? O un approccio migliore qui?

Aggiornato: Aggiunto quello che faccio attualmente; Sperando di chiarire il mio caso d'uso.

È stato utile?

Soluzione

Per quanto riguarda le migliori pratiche, non sono davvero sicuro di cosa stai cercando di realizzare qui, quindi non posso indicarti nella giusta direzione.

Tuttavia, per rispondere direttamente alla tua domanda: posizionare gli enum in spazi dei nomi separati risolverebbe il tuo problema:

namespace IntVals {
   enum ValueInt {
      kOne = 1
   };
}
namespace CharVals {
   enum ValueChar {
      kOne = '1'
   };
}

class StoresValueAsInt {
   static ValueInt value;
};
class StoresValueAsChar {
   static ValueChar value;
};

Quindi dovresti essere in grado di utilizzare quanto segue:

StoresValueAsInt::value == CharVals::kOne

Anche se questo è brutto, e vorrei aver capito meglio quello che stavi cercando per offrire una soluzione più elegante di così.

Altri suggerimenti

C'è un modo per non far dichiarare gli Enums nello spazio dei nomi? O un approccio migliore qui?

Sì, puoi differenziare i tuoi enum come di seguito:

struct ValueInt {
  enum {  // no need to have enum Name
    kOne = 1
  };
};
struct ValueChar {
  enum {  // no need to have enum Name
    kOne = '1'
  };
};

Uso:

ValueInt::kOne;
ValueChar::kOne;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top