अधिकतम और न्यूनतम मान C ++ एनुम में


83

क्या c ++ में enum के अधिकतम और न्यूनतम परिभाषित मूल्यों को खोजने का कोई तरीका है?


पर एक नजर डालें github.com/Neargye/magic_enum lib
dalle

1
एक कारण यह है कि मैं किसी एनम का अधिकतम मूल्य जानना चाहता हूं, इसे एनम में शामिल किए बिना ही ऐसा होता है, इसलिए मेरा कंपाइलर शिकायत नहीं करता है (C4061) जब मेरा 'स्विच' स्टेटमेंट स्पष्ट रूप से "अधिकतम मूल्य" मान को हैंडल नहीं करता है।
स्निप्स-एन-घोंघे

जवाबों:


96

नहीं, C ++ में किसी भी एनम के अधिकतम और न्यूनतम परिभाषित मूल्यों को खोजने का कोई तरीका नहीं है। जब इस तरह की जानकारी की आवश्यकता होती है, तो अंतिम और पहले मूल्य को परिभाषित करने के लिए अक्सर अच्छा अभ्यास होता है। उदाहरण के लिए,

enum MyPretendEnum
{
   Apples,
   Oranges,
   Pears,
   Bananas,
   First = Apples,
   Last = Bananas
};

वहाँ के बीच हर मूल्य के लिए मूल्यों को नामित करने की आवश्यकता नहीं है Firstऔर Last


3
गैर-अनुक्रमिक एनम के लिए अभी भी उपयोगी है - जब तक आप मौजूद होने के लिए हर मूल्य की उम्मीद नहीं करते हैं
एड्रियन कोर्निश

@ एड्रियन: हाँ, यह सच है। इस तकनीक के उपयोगी होने के लिए आपको हर नाम की आवश्यकता नहीं है। मैं तदनुसार संपादित करता हूं
जेफ येट्स

ठीक है, लेकिन अगर नए जोड़े जाते हैं तो आपको इसे बनाए रखना होगा।
मैट

30

नहीं, मानक C ++ में नहीं। आप इसे मैन्युअल रूप से कर सकते हैं:

enum Name
{
   val0,
   val1,
   val2,
   num_values
};

num_values इनम में मानों की संख्या समाहित होगी।


num_values ​​में मानों की संख्या -1 होगी
4pie0

12
@ लिज़ुसेक: अपने आप num_valuesको छोड़कर एनम में मूल्यों की संख्या समाहित करेगा num_values
dalle

3
@dalie हाँ, इसीलिए यह होगा: मानों की संख्या - 1. बेशक मैं जानता हूँ कि आपका मतलब उन मूल्यों से है जिनका अर्थ है पिछले एक को छोड़कर मान जो एक वास्तविक मूल्य नहीं है, बल्कि एक सहायक है। हालाँकि मैं इसे और अधिक स्पष्ट करने का सुझाव दूंगा।
टी ०

1
@ डेली केवल अगर val0 = 0
user2470258

@ user2470258 जैसा कि ऊपर परिभाषित किया गया है यह हमेशा 0.
dalle

6

सी या सी ++ में एन एनम केवल स्थिरांक की एक सूची है। ऐसी कोई उच्च संरचना नहीं है जो इस तरह की जानकारी रखती हो।

आमतौर पर जब मुझे इस तरह की जानकारी की आवश्यकता होती है, तो मैं enum में अधिकतम और न्यूनतम मूल्य कुछ इस तरह से शामिल करता हूं:

enum {
  eAaa = 1,
  eBbb,
  eCccc,
  eMin = eAaaa,
  eMax = eCccc
}

यह कैसे उपयोगी हो सकता है इसके कुछ उदाहरणों के लिए इस वेब पेज को देखें: स्टूपिड एनम ट्रिक्स


आपके द्वारा जोड़ा गया लेख उस समय से है जब लेखक संकलक "नए आधिकारिक C ++ बुलियन प्रकार का समर्थन नहीं करता है" .... मैंने पहले कभी ऐसा कुछ नहीं पढ़ा है: पी।
बड़ा_प्रेम_िस_463035818

4
  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

परिभाषा के बाद, My_enum :: LAST_VALUE == N + 1


-1

स्वचालित रूप से नहीं, लेकिन आप न्यूनतम और अधिकतम मानों को दर्शाने के लिए कृत्रिम एनम मान जोड़ सकते हैं, जैसे

typedef enum {start_of_colors=-1, eRed, eWhite, eBlue, eGray,
end_of_colors} eListOfTags;

for (eListOfTags i = start_of_colors+1; i < end_of_colors; i++) {
.... 
}

1
उत्तर के साथ मदद करने के लिए एक विवरण जोड़ने पर विचार करें।
बीबरटी

-5

आपको उनकी आवश्यकता भी नहीं है, मैं जो करता हूं वह सिर्फ उदाहरण के लिए कहता हूं यदि आपके पास है:

enum Name{val0,val1,val2};

यदि आपके पास स्विच स्टेटमेंट है और यह जांचने के लिए कि क्या अंतिम मूल्य निम्नलिखित के रूप में पहुंचा था:

if(selectedOption>=val0 && selectedOption<=val2){

   //code
}

16
यह एक बहुत ही नाजुक उपाय है। यदि आप एक नया enum मान जोड़ते हैं, तो आपको ऐसे परीक्षणों को अपडेट करने के लिए अपने पूरे कोड आधार का सर्वेक्षण करना होगा।
मार्सेलो कैंटोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.