2017-01-07 34 views
5

Kendi kapsamlı enum'umu kullanmamı gerçekten istediğim üçüncü taraf kodlanmamış bir enum (değiştiremediğim) var. Dönüşüm operatörü gibi bir şeyi nasıl sağlayabilirim?Enemler nasıl dökülür?

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

ThirdPartyNumber den MyNumber için döküm çeşit sağlamak için bir yol var mı: Ben yapmak istiyorum ne

böyle bir şeydir?

+1

Eğer oyuncularla bekliyorduk çıkış neydi:
Neyse, yine de dönüşüm mantığını merkezileştirme ve böyle bir şey yapmak için özellikleri kullanabilir? – user

+0

Peki, ben ThirdPartyLetter :: A MyNumber :: ONE ve ThirdPartyLetter :: B MyNumber :: TWO dönüştürmek için cast istiyorum. Bu yüzden beklenen çıktım 1 olur. –

cevap

8

C++ derlemesinde bunu yapmak için deyimsel bir yol, özellikleri kullanır. Örnek olarak
:

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

çalışma zamanında, belki bir switch uygundur bunu yapmak istiyorsanız

.

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

Neden sadece "Foo :: ONE: return :: :: –

+1

@ThomasJohnson Genellikle, bu enumlarla çalıştığınız birden fazla noktanız varsa, dönüşüm mantığındaki her değişiklik, tüm bu kod parçalarını değiştirmenizi gerektirir. Bu durumda, özellikler kodunuzu yazabileceğiniz bir merkezi tanım gibi çalışır. – skypjack

+0

Teşekkürler, bu –