2012-05-02 15 views
5

क्या संकलन समय और रन टाइम दोनों पर काम करने के लिए तारों को लागू करने का कोई तरीका है?सी ++ 11 कॉन्स्टेक्स स्ट्रिंग कार्यान्वयन

एक वर्ग के लिए AFAIK का निर्माण करने के लिए इसे एक छोटा विनाशक होना चाहिए। हालांकि, जब हम तारों से निपट रहे हैं तो यह मुश्किल साबित होता है। यदि स्ट्रिंग कंस्ट्रैक्स नहीं है, तो इसे स्मृति को डिलीकेट करने की आवश्यकता है। हालांकि, अगर यह constexpr है, तो यह स्थिर रूप से आवंटित किया गया है और हटाया नहीं जाना चाहिए, इस प्रकार एक छोटे विनाशक की अनुमति।

हालांकि, यह कहना संभव नहीं है "अरे, कंपाइलर! अगर मैं समेकित हूं, तो आपको मुझे नष्ट करने की आवश्यकता नहीं है!" या यह है?

यह निम्न की तरह कुछ होगा:

class string { 
private: 
    char * str; 
public: 
    template<std::size_t l> 
    constexpr string(const char (&s)[l]) : str(&(s[0])) {} 
    string(const char * s) { str = strdup(s); } 
    static if (object_is_constexpr) { 
     ~string() = default; 
    } 
    else { 
     ~string() { free(str); } 
    } 
}; 

निकटतम मैं आने के लिए दो अलग-अलग प्रकार, स्ट्रिंग और constexpr_string, उपयोगकर्ता परिभाषित शाब्दिक _string लौटने constexpr_string रहा है कर लिया है, और एक उपयोगकर्ता - constexpr_string से स्ट्रिंग तक निर्धारित अंतर्निहित रूपांतरण।

हालांकि यह बहुत अच्छा नहीं है, क्योंकि const auto s = "asdf"_string; काम करता है लेकिन const string s = "asdf"_string; नहीं है। इसके अतिरिक्त, एक constexpr_string के लिए एक संदर्भ/सूचक परिवर्तित नहीं होगा। विरासत किसी भी तरह से अंतर्ज्ञानी "गॉचा" का कारण बनती है, और पहली समस्या का समाधान नहीं करती है।

ऐसा लगता है कि यह संभव होना चाहिए, जब तक कि संकलक प्रोग्रामर को ट्रस्ट करना था कि कॉन्स्टेक्स को नष्ट करने की आवश्यकता नहीं थी।

यदि मुझे कोई गलत धारणा है तो मुझे बताएं।

+0

मुझे लगता है कि आप http://akrzemi1.wordpress.com/2011/05/11/parsing-strings-at-compile-time-part-i/ – Cubbi

+0

स्ट्रिंग लिटरेल्स 'कॉन्स्ट चार से 'स्ट्रॉप' की तलाश में हैं (और वार) [एन] '_are_ 'constexpr' स्ट्रिंग प्रकार। –

+1

जब आप लोगों को अनुमोदित होने से पहले 'स्थिर अगर' जैसी सुविधाओं का उपयोग करना शुरू करते हैं तो आपको प्यार करना होगा! –

उत्तर

9

यह केवल विनाश की बात नहीं है।

एक constexpr आपरेशन केवल अन्य constexpr संचालन और new, malloc आदि बुलाना चाहिए ... नहींconstexpr हैं। ध्यान दें कि यह एक स्थाई रूप से चेक की गई संपत्ति है और रनटाइम तर्क पर निर्भर नहीं है, इसलिए इस तरह के फ़ंक्शन पर कॉल पूरी तरह से अनुपस्थित होना चाहिए, न केवल उस शाखा में छिपी हुई है जिसे (माना जाता है) नहीं लिया जाता है।

इस प्रकार, constexprstring प्राप्त करना कभी भी संभव नहीं होगा।

+0

यह एक गैर-कंस्ट्रक्शन निर्माता में भी नहीं हो सकता है?ऐसा लगता है कि किसी दिए गए प्रकार के लिए दोनों कॉन्सएक्सप्रस और गैर-कंस्ट्रैक्टर कन्स्ट्रक्टर होना संभव है, जैसे कि कॉन्स और गैर-कॉन्स्टेंस विधियां हो सकती हैं। –

+0

आप पूरी तरह से 'constexpr' स्ट्रिंग-प्रकार बना सकते हैं, यह गैर-कॉन्स्टेक्स स्ट्रिंग को संभालने में सक्षम नहीं होगा। बस रूपांतरण कार्यों को बनाओ। –

+0

जिस तरह से मैं इसे देखता हूं, constexpr संकलन समय और रन टाइम गणना के बीच की रेखा को धुंधला करने का एक तरीका है। आदिम प्रकार इस की अनुमति देते हैं, और ऐसा लगता है कि कक्षाओं में पॉइंटर्स को या तो शाब्दिक या गतिशील आवंटित स्मृति को इंगित करने के लिए कुछ चीजें करना संभव होना चाहिए। कार्यात्मक भाषाओं ने कुछ समय के लिए संकलन समय/रन टाइम सीमा पर सार लगाया है। @ म्यूइंग डक: रूपांतरण फ़ंक्शन अबास्ट्रक्शन को तोड़ने लगते हैं –

0

यह संभव है, कुछ हद तक, the code example in this page देखें। आप constexpr conststr ऑब्जेक्ट्स बना सकते हैं और उन पर कुछ ऑपरेशन कॉल कर सकते हैं, लेकिन आप उन्हें गैर प्रकार के टेम्पलेट पैरामीटर के रूप में उपयोग नहीं कर सकते हैं।