2016-03-08 28 views
5

जबकि std::experimental::optional (cppreference.com) मैं एक विशिष्ट निर्माता के विनिर्देश, अर्थात् से उलझन में मिल गया को लागू करने:std :: प्रयोगात्मक :: वैकल्पिक <T> कार्यान्वयन: Constexpr निर्माता भ्रम

constexpr optional(const T& value); // (4) 

(Source)

यह कन्स्ट्रक्टर constexpr संदर्भ में निर्मित होने के लिए, एक छोटे से विनाशकारी प्रकार T के लिए optional<T> की अनुमति देता है। जबकि पहली आवश्यकता, अर्थात् optional<T> को एक शाब्दिक प्रकार बनाने के लिए उपयोगकर्ता द्वारा प्रदान किए गए विनाशक को बंद करना, हल करने के लिए सीधे आगे है, मुझे नहीं पता कि की सीमा के आसपास कैसे जाना है- नई जगह को कॉन्टेक्सप्र में अनुमति नहीं दी जा रही है ।

मैंने सोचा कि मैं std::aligned_storage<T> का उपयोग कर प्रकार T कि constructible डिफ़ॉल्ट नहीं कर रहे हैं और किसी भी संरेखण आवश्यकताओं को पूरा, यदि लागू हो अनुमति देने के लिए optional<T> लागू करने के लिए चाहिए था। लेकिन जैसा कि मैंने कहा, constexpr मुझे उस विशेष निर्माता में प्लेसमेंट का उपयोग करने से मना कर देता है।

क्या मुझे बहुत कॉफी चाहिए और मुझे यहां कोई स्पष्ट समाधान नहीं दिख रहा है?

आप

+0

की संभावित डुप्लिकेट [कैसे एक std :: वैकल्पिक इस्तेमाल करना चाहिए?] (Http://stackoverflow.com/questions/16860960/how-should-one- उपयोग-stdoptional) – Matriac

+2

@Matriac यह कार्यान्वयन पक्ष के बारे में एक सवाल है। – nshct

+1

एक 'संघ' इस विशेष निर्माता के लिए काम कर सकता है, लेकिन मुझे विश्वास नहीं है कि यह सभी मामलों को संभालने के लिए पर्याप्त होगा। – hvd

उत्तर

4

मैं स्थान-नए की सीमा constexpr में अनुमति नहीं किया जा रहा से बचने के लिए पता नहीं कैसे धन्यवाद।

यह एक सही निदान, शाब्दिक प्रकार, constexpr है और नए अभिव्यक्ति मिश्रण नहीं करते हैं। std::experimental::optional<T> की विभिन्न आवश्यकताओं को पूरा करने का सबसे सरल तरीका इसे संस्करण सदस्यों के साथ कार्यान्वित करना है। स्पष्ट रूप से रखें, किसी बिंदु पर union शामिल होना चाहिए। एक त्वरित स्केच:

template<typename Val> 
struct optional { 
    union { 
     Val optional_value; 
     unsigned char dummy_byte; 
    }; 
    bool filled; 

    // post-condition: no-value state 
    constexpr optional() 
     : dummy_byte {} 
     , filled(false) 
    {} 

    // post-condition: has-value state 
    constexpr optional(Val const& val) 
     : optional_value(val) 
     , filled(true) 
    {} 

    // other special members omitted for brevity 
}; 

Live On Coliru

तथ्य की बात के रूप में, optional प्रस्तावों की पुरानी श्रृंखला प्रदर्शित करने के लिए है कि आवश्यकताओं को यह प्रस्तुत बिल्कुल उचित थे have a paragraph on the technique करते थे। (आजकल std::experimental::optional विभिन्न लाइब्रेरी बुनियादी बातों उम्मीदवार TSS में अमर हो गया।)

+0

धन्यवाद। मुझे नहीं पता कि मैं aligned_storage पर इतना ध्यान केंद्रित क्यों कर रहा था, लेकिन यह सही समाधान है। – nshct

संबंधित मुद्दे