C ++ में Enum कैसे डाले?


222

C ++ में Enum करने के लिए मैंने एक int कैसे डाला?

उदाहरण के लिए:

enum Test
{
    A, B
};

int a = 1;

मैं कैसे aटाइप Test::Aकरूं?


1
लिंक ध्यान दें कि यह कोई फर्क नहीं पड़ता कि इंट एनम प्रकार के स्थिरांक में से एक से मेल खाता है या नहीं; प्रकार रूपांतरण हमेशा अवैध होता है।
इवाज

3
मेरा मानना ​​है कि यदि आप परीक्षण करना चाहते हैं :: int aइच्छा का मान 0 होना चाहिए, क्योंकि परीक्षण :: A का निहितार्थ मान 0 है और परीक्षण :: B का निहितार्थ मान है। विशेष रूप से टेस्ट :: ए बिंदु के अलावा है ...
JohnRDOrazio

जवाबों:


243
int i = 1;
Test val = static_cast<Test>(i);

21
ऑटो वैल = स्टेटिक_कास्ट <टेस्ट> (i); // C ++ 11
मिच

3
@ मिच autoइस मामले में उपयोग करने के लिए मुझे क्या मिलेगा ? क्या कोई प्रदर्शन सुधार है?
फ्रेडरिक पंटुज़ा

2
कोई प्रदर्शन सुधार नहीं। यदि आप "ऑटो" के साथ निर्दिष्ट करते हैं तो कंपाइलर केवल स्वचालित रूप से टाइप करता है। यदि आप भविष्य में अपना enum नाम बदलने का निर्णय लेते हैं, तो आप अपने कोड को कम संशोधित करेंगे क्योंकि कंपाइलर स्वचालित रूप से सही प्रकार के नाम को घटा देगा।
ऐयडिन

74
Test e = static_cast<Test>(1);

10
MSDN: static_cast ऑपरेटर स्पष्ट रूप से एक अभिन्न प्रकार के अभिन्न मान को परिवर्तित कर सकता है। यदि अभिन्न प्रकार का मान गणना मूल्यों की सीमा में नहीं आता है, तो परिणामी गणना मूल्य अपरिभाषित है।
किरिल कोबेलेव

1
@KillillKobelev यदि अभिन्न मूल्य को एनम के अंतर्निहित प्रकार द्वारा दर्शाया जा सकता है, तो परिणामी एनम को उस मान का होना चाहिए। अन्यथा उत्पादित एनम मूल्य अभिव्यक्ति के एन्नम के अंतर्निहित प्रकार में परिवर्तित होने से जो भी परिणाम होगा, वह होगा। अगर VC ++ कुछ अलग करता है तो मुझे लगता है कि यह गैर-अनुरूप है।
bames53

2
एक अनुरूप कंपाइलर को क्या करना चाहिए, अगर एनम के पास मान {1,3,5} है और कोड <static_cast> के मूल्य से करने का प्रयास करता है। 2. यह सी-कास्ट से कैसे भिन्न होगा?
किरिल कोबेलेव

6
@KirillKobelev मैं एक static_cast का उपयोग नहीं कर रहा हूँ क्योंकि यह C शैली की कास्ट से अलग कुछ भी करता है, मैं static_cast का उपयोग कर रहा हूँ क्योंकि C ++ कलाकार शैलीगत रूप से C जातियों के लिए बेहतर हैं।
bames53

4
@KirillKobelev " यदि एनम के मान {1,3,5} हैं " नहीं। गणन प्रकार केवल इन 3 संभावित मूल्यों तक सीमित नहीं हो सकते हैं: {1,3,5} प्रगणक हैं (एन्यूमरेशन वैल्यूज का नाम), केवल एन्यूमरेशन नहीं । यदि 1,3,5 संभव गणना मूल्य हैं, तो 2. है
क्यूरियस गुय

25

तुम्हारा कोड

enum Test
{
    A, B
}

int a = 1;

उपाय

Test castEnum = static_cast<Test>(a);

45
यह सबसे अच्छा विचार है कि आप जो सबसे अधिक प्रतिबंधात्मक कास्ट का उपयोग कर सकते हैं, और सी-स्टाइल के कलाकारों से पूरी तरह से बचें, कंपाइलर को गलतियों का पता लगाने का सबसे अच्छा मौका देने के लिए। static_castयहां बेहतर कलाकार होंगे।
माइक सेमोर

4
@ माइक सीमौर, समस्या यह है कि इस मामले में स्थिर कलाकारों को सी-कास्ट से कोई अंतर नहीं है। यह कैसे और किस गलती का पता लगा सकता है ???
किरिल कोबेलेव

7
@KirillKobelev: समस्या यह है कि सी-स्टाइल कास्ट स्पष्ट नहीं है। यह एक के बराबर हो सकता है static_cast, लेकिन यह एक const_castया एक से भी बदतर हो सकता है, reinterpret_castया उन लोगों का एक संयोजन भी हो सकता है। यहां तक ​​कि अगर आप अब यह जानते हैं कि यह किस तरह से नीचा दिखाएगा, मान लीजिए कि आप aबाद में एक और प्रकार में बदल जाते हैं, तो यह बहुत अच्छी तरह से कास्टिंग परिवर्तन का प्रकार हो सकता है, जैसा कि आप कभी भी चेतावनी के रूप में प्राप्त कर रहे हैं, आप ऐसा नहीं चाहते हैं।
किलियनडीएस

4
@KillianDS " मान लें कि आप बाद में किसी अन्य प्रकार से " किस प्रकार का परिवर्तन करते हैं ?
जिज्ञासु

2
हाँ, यदि उपलब्ध हो तो या तो उन या निहित कलाकारों को। यह बहुत स्पष्ट है कि कलाकारों का इरादा क्या है।
किलियनडीएस

8

समापन प्रश्न को काटते हुए, "कैसे मैं एक प्रकार को रूपांतरित करता हूं Test::A" के बजाय उसमें एक कलाकार होने की आवश्यकता के बारे में कठोर होने के अलावा , और कई वर्षों के उत्तर देने के बाद बस यह एक लोकप्रिय प्रश्न लगता है किसी और ने विकल्प का उल्लेख नहीं किया है , प्रति C ++ 11 मानक:

5.2.9 स्टेटिक कास्ट

... एक अभिव्यक्ति eस्पष्ट रूप से एक प्रकार में बदला जा सकता T है एक का उपयोग कर static_castफार्म की static_cast<T>(e)अगर घोषणा T t(e);, अच्छी तरह से बनाई है कुछ का आविष्कार अस्थायी चर के लिए t(8.5)। इस तरह के एक स्पष्ट रूपांतरण का प्रभाव घोषणा और आरंभीकरण करने और फिर रूपांतरण के परिणामस्वरूप अस्थायी चर का उपयोग करने के समान है।

इसलिए सीधे रूप का उपयोग करना t(e)भी काम करेगा, और आप इसे नीरसता के लिए पसंद कर सकते हैं:

auto result = Test(a);

इस समाधान ने संकलक के मामले में काम किया, जिसने static_cast <> (सिमेंटिक चेक) को अवरुद्ध कर दिया। ऐसा नहीं है कि यह मेरे लिए समझ में आता है, लेकिन अभी भी साफ है।
मिस्टर बिसन

1

Test castEnum = static_cast<Test>(a-1);A को कास्ट करेगा। यदि आप 1 को सबस्ट्रक्ट नहीं करना चाहते हैं, तो आप इसे फिर से परिभाषित कर सकते हैं enum:

enum Test
{
    A:1, B
};

इस मामले में `टेस्ट कास्टीनम = स्टेटिक_कास्ट (ए) ;; A को A में डालने के लिए उपयोग किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.