2017-01-07 6 views
5

मेरे पास एक थर्ड-पार्टी अनकॉप्ड एनम है (जिसे मैं संशोधित नहीं कर सकता) कि मैं वास्तव में अपने स्वयं के स्कोप्ड एनम पर डालना चाहता हूं। मैं रूपांतरण ऑपरेटर की तरह कुछ कैसे प्रदान कर सकता हूं?कैसे enums कास्ट करने के लिए?

मैं क्या करना चाहते हैं क्या कुछ इस तरह है:

#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 से MyNumber लिए कास्टिंग के कुछ प्रकार प्रदान करने के लिए एक तरीका है?

+1

उत्पादन आप अपने कलाकारों के साथ उम्मीद कर रहे थे क्या था:
वैसे भी, आप अभी भी अपने रूपांतरण तर्क को केंद्रीकृत और इस तरह कुछ करने के लिए उपयोग कर सकते हैं लक्षण? – user

+0

खैर, मैं चाहता हूं कि कलाकार को थर्डपार्टी लिटर :: ए टू मायनंबर :: वन, और थर्डपार्टी लिटर :: बी टू मायनंबर :: TWO में कनवर्ट करना पड़े। तो मेरा अनुमानित आउटपुट 1. –

उत्तर

8

सी ++ में संकलन-समय पर ऐसा करने का एक मूर्ख तरीका लक्षणों का उपयोग कर रहा है।
एक उदाहरण के रूप:

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

आप जो रनटाइम पर, हो सकता है एक स्विच अच्छी तरह से अनुकूल है ऐसा करने के लिए चाहते हैं।

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

केवल 'केस Foo :: ONE: वापसी बार :: तीन' करने से बेहतर गुणों का उपयोग क्यों कर रहा है? –

+1

@ थॉमस जोहानसन आमतौर पर, यदि आपके पास एक से अधिक बिंदु हैं जहां आप उन enums के साथ काम करते हैं, तो रूपांतरण तर्क में प्रत्येक परिवर्तन के लिए आपको कोड के उन सभी टुकड़ों को संशोधित करने की आवश्यकता होगी। इस मामले में, लक्षण एक केंद्रीकृत परिभाषा की तरह कार्य करते हैं जिस पर आप अपना कोड लिख सकते हैं। – skypjack

+0

धन्यवाद, यह समझ में आता है –

संबंधित मुद्दे