2011-09-05 15 views
8

क्या दो enums के बीच परिवर्तित करने के लिए एक कास्ट ऑपरेटर अधिभार करने का कोई तरीका है?दो enums के बीच अधिभार कास्ट ऑपरेटर

मेरी कोड में मैं

enum devStatus 
{ 
    NOT_OPERATING, 
    INITIALISING, 
    DEGRADED, 
    NORMAL 
}; 

enum dataStatus 
{ 
    UNAVAILABLE = 1, 
    DEGRADED, 
    NORMAL 
} 

है जहां NOT_OPERATING और अनुपलब्ध को आरंभ नक्शा; सीधे और पूरे नक्शे पर नक्शा। ये बाहरी इंटरफेस द्वारा तय किए गए हैं।

मैं एक तरह से devStatus और dataStatus के बीच परिवर्तित करने के लिए देख रहा हूँ और की तरह कुछ लिखने में सक्षम होना चाहते हैं:

devStatus devSts; 
getDeviceStatus(&devSts); 
dataStatus dataSts = (dataStatus)devSts; 

मुझे पता है कि अगर इन कक्षाओं में थे, मैं devStatus::operator dataStatus() लिख सकता है यह करने के लिए। क्या एक enums के लिए ऐसा करने का कोई तरीका है?

मैं सिर्फ एक मुक्त समारोह dataStatus devStatus2dataStatus(const devStatus& desSts)

उत्तर

13

सी ++ में रूपांतरण ऑपरेटरों केवल वर्ग, struct, और संघ घोषणाओं के भीतर घोषित किया जा सकता हो सकता था,। उन्हें प्रकार के बाहर घोषित नहीं किया जा सकता है (उदाहरण के लिए ऑपरेटर +, उदाहरण के लिए)। एनम प्रकार घोषणाएं उदाहरण सदस्यों का समर्थन नहीं करती हैं, इसलिए आपको रूपांतरण फ़ंक्शन के साथ जाना होगा। ऐसा करने से कॉलिंग कोड स्पष्ट हो जाएगा। निम्न उदाहरण इस दर्शाता है, enumerations और रूपांतरण कार्यों गुंजाइश के लिए कस्टम नामस्थान का उपयोग कर:

namespace TheirEnum { 
    enum Type { 
     Value1, 
     Value2 
    }; 
} 
namespace MyEnum { 
    enum Type { 
     Value1, 
     Value2 
    }; 

    TheirEnum::Type ToTheirEnum (Type e) { 
     switch (e) { 
     case Value1: return TheirEnum::Value1; 
     case Value2: return TheirEnum::Value2; 
     default: throw std::invalid_argument("e"); 
     } 
    } 
} 

// usage: 
TheirEnum::Type e = MyEnum::ToTheirEnum(MyEnum::Value1); 
+0

क्या बजाय प्रत्येक enum के लिए एक वर्ग को परिभाषित करने के फायदे/disadvantes, और रूपांतरण ऑपरेटरों कर रहे हैं? डाउनसाइड अधिक बॉयलरप्लेट कोड पर। ऊपरी नामस्थान के आस-पास तैरने वाले अपरिवर्तनीय फ़ंक्शन पर - हालांकि ऐसा कहा जाता है कि enums पहले से ही वहां के आसपास तैर रहे हैं। क्षमता संकलक अनुकूलन के साथ समान होना चाहिए। –

+0

मैं मानता हूं कि सी ++ एनम्स के लिए नाम स्कॉइंग आदर्श नहीं है, लेकिन प्रत्येक enum के लिए कक्षा बनाने के खरगोश छेद को नीचे किए बिना, एनम घोषणा और रूपांतरण नाम को नामस्थान के साथ लपेटकर आसानी से बचा जा सकता है। उस रास्ते पर जाकर तार्किक मुद्दों को सामने लाया गया है जैसे कि एक/है-रिश्ते और किस ऑपरेटरों को इस प्रकार के लिए उपलब्ध कराया जाना चाहिए। मुझे लगता है कि ऐसा करना शायद अधिकतर गणनाओं के लिए अधिक है। –

+0

मैंने एक उदाहरण नामस्थान घोषणा और नमूना उपयोग के साथ उत्तर अद्यतन किया। –

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