5 votes

Comment couler les enums ?

J'ai un enum non cadré d'une tierce partie (que je ne peux pas modifier) que j'aimerais vraiment convertir en mon propre enum cadré. Comment puis-je fournir quelque chose comme un opérateur de conversion ?

Ce que j'aimerais faire, c'est quelque chose comme ça :

#include <iostream>
enum ThirdPartyLetter {
  A=4,
  B=5
};

enum class MyNumber {
  ONE=1,
  TWO=2

  // This doesn't compile, of course
  /*Number(const ThirdPartyLetter& rhs) {
    if(rhs == ThirdPartyLetter::A) {
      return ONE;
    }
    else {
      return TWO;
    }
  }*/
};

int main() {
  ThirdPartyLetter letter = ThirdPartyLetter::A;
  MyNumber number = static_cast<MyNumber>(letter);
  // Without the cast, this prints 4 (an invalid enum value!)
  std::cout << int(number) << std::endl;
}

Existe-t-il un moyen de fournir une sorte de casting à partir de ThirdPartyNumber a MyNumber ?

8voto

skypjack Points 5516

Une façon idiomatique de le faire au moment de la compilation en C++ est d'utiliser les traits.
A titre d'exemple :

enum Foo { ONE, TWO };
enum Bar { THREE, FOUR };

template<Foo> struct conv;
template<> struct conv<Foo::ONE> { static constexpr Bar value = Bar::THREE; };
template<> struct conv<Foo::TWO> { static constexpr Bar value = Bar::FOUR; };

Si vous voulez le faire au moment de l'exécution, un commutateur est peut-être mieux adapté.
Quoi qu'il en soit, vous pouvez toujours utiliser les traits pour centraliser votre logique de conversion et faire quelque chose comme ceci :

Bar get(Foo choice) {
    switch(choice) {
    case Foo::ONE:
        return conv<ONE>::value;
     case Foo::TWO:
        return conv<TWO>::value;
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X