को देखते हुए enum class val { foo = 1, bar = 2, baz = 4 };
क्या यह enum मानों को डालने के लिए कानूनी है क्या enum द्वारा प्रतिनिधित्व योग्य नहीं है?
यह परिभाषित करना संभव है:
val operator|(val x, val y)
{
return static_cast<val>(static_cast<int>(x) | static_cast<int>(y));
}
हालांकि, यह ऐसा करने के लिए अर्थ की दृष्टि से सही है?
मैं, कोई की ओर झुकाव रहा हूँ के रूप में निम्नलिखित में प्रदर्शन किया, मालूम होता है उदाहरण के लिए अच्छी तरह से व्यवहार कर:
int convert(val x)
{
switch(x)
{
case val::foo: return 42;
case val::bar: return 53;
case val::baz: return 64;
}
}
convert(val::foo | val::bar)
कॉलिंग 0
वापस आ जाएगी जब जी ++ और बजना साथ ++ विभाजन गलती के साथ संकलित।
Here जी ++ संस्करण है। और here क्लैंग ++ संस्करण है।
मेरा प्रश्न है दो गुना:
- यह एक enum है कि एक प्रगणक द्वारा प्रतिनिधित्व नहीं कर रहे हैं में शब्दार्थ दुकान मूल्यों के लिए सही है? मानक से अंश स्वागत है।
1.a उपरोक्त लिंक किए गए उदाहरणों, जी ++ या क्लैंग ++ में कौन सा कंपाइलर सही है?
- क्या सी ++ में झंडे का प्रतिनिधित्व करने के लिए कोई मानक (या प्रस्तावित) तरीका है?
मैं कई संभव कार्यान्वयन के बारे में सोच सकते हैं:
enum class val { foo, bar, baz, size };
using val_flags = std::set<val>; // (1)
using val_flags = std::vector<bool>; // (2)
using val_flags = std::bitset<val::size>; // (3)
using val_flags = std::underlying_type<val>::type; // (4)
अद्यतन:
आप सभी अपने जवाब के लिए धन्यवाद। मैं अपने पुराने एनम ऑपरेटर टेम्पलेट को पुनर्जीवित करना समाप्त कर दिया। में मामला किसी को दिलचस्पी है, इसे यहाँ पाया जा सकता है: github.com
मुझे लगता है कि तुम वहाँ अपरिभाषित व्यवहार हो सकता है कर सकते हैं (यह मानते हुए 'convert' कानूनी है):' x' किसी भी मूल्य 'val' में फिट नहीं करता है, और तो तुम लापता वापसी कथन के कारण अपरिभाषित व्यवहार प्राप्त करें। – Rakete1111
एकमात्र समस्या जो मैं यहां देखता हूं वह यह है कि 'int कन्वर्ट (वैल एक्स)' की संभावना किसी भी मूल्य को वापस नहीं करने की संभावना है। मुझे पूरा यकीन है कि आपके कंपाइलर ने इसके बारे में चेतावनी जारी की है। – Havenard