2017-01-07 62 views
5

Mam niezalogowane wyliczenie strony trzeciej (którego nie mogę zmodyfikować), które bardzo chciałbym rzucić na moje własne wyliczenie. Jak mogę zapewnić coś w rodzaju operatora konwersji?Jak obsypać wyrazy?

Co chciałbym zrobić coś takiego:

#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; 
} 

Czy istnieje sposób, aby zapewnić pewnego rodzaju odlewy z ThirdPartyNumber do MyNumber?

+1

Co było wyjście pan oczekiwał z obsadą? – user

+0

Cóż, chciałbym, aby obsada przekształciła ThirdPartyLetter :: A na MyNumber :: ONE, a ThirdPartyLetter :: B na MyNumber :: TWO. Tak więc moje oczekiwane wyniki wyniosłyby 1. –

Odpowiedz

8

Idiomatyczny sposób wykonania tej czynności podczas kompilacji w C++ polega na użyciu cech.
Jako przykład:

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; }; 

Jeśli chcesz to zrobić w czasie wykonywania, może przełącznik doskonale nadaje.
W każdym razie, można nadal korzystać z cech scentralizowanie logiki konwersji i zrobić coś takiego:

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

Dlaczego używanie cech jest lepsze niż po prostu wykonanie 'case Foo :: ONE: return Bar :: TRZY'? –

+1

@ThomasJohnson Zwykle, jeśli masz więcej niż jeden punkt, w którym pracujesz z tymi wyliczeniami, każda zmiana w logice konwersji będzie wymagać modyfikacji wszystkich tych fragmentów kodu. W tym przypadku cechy działają jak scentralizowana definicja, na której możesz napisać swój kod. – skypjack

+0

Dzięki, że ma sens –