मेरे पास myClass.h में इस तरह परिभाषित एक एनम क्लास है:

enum class SpeedMode {
  SPEED_SLOW = 0,
  SPEED_NORMAL = 1,
  SPEED_FAST = 2
};

एक अन्य फाइल में मैं अपने एनम को एक इंट के रूप में उपयोग करना चाहूंगा:

void myOtherClass::myFunc(const SpeedMode& speed_mode) {
  int speed_as_int = speed_mode;
.
.
.
}

उसी फ़ाइल में मैंने अपना एनम (myClass.h) परिभाषित किया है, मैं एक ऑपरेटर ओवरराइड को परिभाषित करने का प्रयास करता हूं:

int operator= (const SpeedMode& mode) {
   return static_cast<int>(mode); //The real logic is more complex and will use a switch statement
}

लेकिन मुझे यह त्रुटि मिलती है: error: 'int operator=(const SpeedMode&)' must be a nonstatic member function

अगर मैं इसे struct SpeedModeUtils { } जैसे किसी चीज़ में लपेटने का प्रयास करता हूं जो उस फ़ाइल को संकलित करने की अनुमति देता है लेकिन फिर myOtherClass मुझे यह त्रुटि देता है जहां मैं ओवरराइड का उपयोग करने का प्रयास करता हूं: error: cannot convert 'const SpeedMode' to 'int' in initialization

मुझे पता है कि मैं पुराने गैर-वर्ग एनम का उपयोग कर सकता हूं, लेकिन यह एक बड़ी परियोजना है और मैं एक एनम वर्ग की प्रकार की सुरक्षा को बहुत पसंद करता हूं। मुझे यह भी पता है कि मैं static_cast का उपयोग कर सकता हूं लेकिन संभावित स्पष्ट कारणों से मैं इससे बचना पसंद करूंगा।

यदि यह विफल हो जाता है तो मैं केवल मैन्युअल रूपांतरण फ़ंक्शन का उपयोग करूंगा, लेकिन मुझे लगा कि यह इसे संभालने का एक 'अच्छा' तरीका होगा।

0
Fozefy 30 अक्टूबर 2020, 22:52

2 जवाब

सबसे बढ़िया उत्तर

आपको एनम वर्ग के अंतर्निहित डेटा प्रकार तक पहुंच की आवश्यकता है, जिसका अर्थ है int। ऐसा करने का तरीका पूर्णांक मान तक पहुंचने के लिए std::underlying_type<T> का उपयोग करना है। आप इसे करने का तरीका है:

#include <type_traits>

auto speed_mode_as_int = static_cast<std::_underlying_type<SpeedMode>::type>(speed_mode); 

मैंने यहां एक न्यूनतम कामकाजी उदाहरण बनाया है जो आपको शुरू करना चाहिए

#include <type_traits>
#include <iostream>
#include <cassert>

enum class SpeedMode {
    SPEED_SLOW = 0,
    SPEED_NORMAL = 1,
    SPEED_FAST = 2
    
};

bool is_fast(const SpeedMode& speed_mode)
{
    auto speed_mode_as_int =
        static_cast<std::underlying_type<SpeedMode>::type>(speed_mode);

    switch(speed_mode_as_int)
    {
    case 2:
        return true;
    default:
        return false;
    }
}
    

int main(void) {

    auto mode = SpeedMode::SPEED_SLOW;

    assert(false == is_fast(mode));
    mode = SpeedMode::SPEED_NORMAL;
    assert(false == is_fast(mode));
    mode = SpeedMode::SPEED_FAST;
    assert(true == is_fast(mode));
        
    return 0; 
}

मैंने इसे निम्नलिखित संकलन स्ट्रिंग के साथ संकलित किया: clang++ -std=c++17 main.cpp.

1
Lars Nielsen 3 नवम्बर 2020, 15:16

जैसा कि एक कंपाइलर ने कहा था, आप ऐसे असाइनमेंट ऑपरेटर को परिभाषित नहीं कर सकते। इसने कहा int operator=(const SpeedMode&)' must be a nonstatic member function, enums के पास C++ में सदस्य नहीं हैं।

0
Gustaw 30 अक्टूबर 2020, 23:04