मैं एक तर्क के आधार पर कन्स्ट्रक्टर में शुरू किए गए यूनियन सदस्य को चुनना चाहता हूं।सी ++ 14 कंस्ट्रैक्स संघ कन्स्ट्रक्टर में सशर्त प्रारंभिक
struct A {
union {
int i;
float f;
};
A(double d, bool isint) {
if (isint) new(&i) int(d);
else new(&f) float(d);
}
};
जब मैं int
और float
उपयोग कर रहा हूँ, लक्ष्य अन्य अधिक जटिल प्रकार के साथ काम करने के लिए (लेकिन अभी भी एक सी ++ 14 संघ में स्वीकार्य) है, इसलिए उपयोग: निम्नलिखित एक उदाहरण है कि काम करता है नियुक्ति के नए (और एक असाइनमेंट नहीं)।
समस्या यह है कि यह कन्स्ट्रक्टर constexpr
नहीं हो सकता है क्योंकि constexpr
विधियों में प्लेसमेंट-नई की अनुमति नहीं है। क्या इसके आसपास कोई रास्ता है (औपचारिक प्रकार प्रणाली के isint
तर्क भाग बनाने के अलावा)? कुछ प्रकार की सशर्त इनटाइलाइज़र सूची काम करेगी, लेकिन मुझे ऐसा करने के तरीके से अनजान है।
आईआईआरसी, निरंतर अभिव्यक्तियों के भीतर पनिंग को प्रतिबंधित (सामान्य रूप से) प्रतिबंधित किया जाता है। उदाहरण के लिए, आप सभी सदस्यों को अलग-अलग स्टोर कर सकते हैं ('संघ' के बजाय 'संरचना') और सदस्यों में से केवल एक को लागू करने के लिए encapsulation का उपयोग सक्रिय है। – dyp
मुझे लगता है कि यह इस बात पर निर्भर करता है कि आप किस प्रकार के प्रकार पर विचार कर रहे हैं। मैं निश्चित रूप से एक कन्स्ट्रक्टर घोषित कर सकता हूं जो 'i' शुरू करता है और एक अलग 'जो' f' प्रारंभ करता है। यूनियन का केवल एक सदस्य किसी भी समय "सक्रिय" हो सकता है, लेकिन मैं इसे हटाने का प्रयास नहीं कर रहा हूं। मैं संकलक को बताकर खुश हूं कि सदस्य सक्रिय है। – cshelton
आप सही हैं। प्लेसमेंट-न्यू का इस तरह का उपयोग वास्तव में टाइप सिस्टम को बाधित नहीं करता है। - बाहरी कार्य में ऐसा करना संभव है, उदा। 'constexpr एक make_A (डबल डी, बूल आइसिंट) {if (isint) वापसी ए (डी, true_type {}); अन्य ए (डी, false_type {}) वापस; } '। यदि आप इसके बजाय गैर-अज्ञात यूनियनों का उपयोग करते हैं, तो इस तरह के फ़ंक्शन को कन्स्ट्रक्टर के भीतर से कॉल करना संभव होना चाहिए।कुछ 'स्ट्रक्चर ए {यूनियन स्टोरेज {int i; फ्लोट एफ; भंडारण (डबल डी, true_type); भंडारण (डबल डी, false_type); } एम; ए (डबल डी, बूल आइसिंट): एम (मेक_स्टोरेज (डी, आईसेंट)) {}}; ' – dyp