क्या संकलन समय और रन टाइम दोनों पर काम करने के लिए तारों को लागू करने का कोई तरीका है?सी ++ 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 के लिए एक संदर्भ/सूचक परिवर्तित नहीं होगा। विरासत किसी भी तरह से अंतर्ज्ञानी "गॉचा" का कारण बनती है, और पहली समस्या का समाधान नहीं करती है।
ऐसा लगता है कि यह संभव होना चाहिए, जब तक कि संकलक प्रोग्रामर को ट्रस्ट करना था कि कॉन्स्टेक्स को नष्ट करने की आवश्यकता नहीं थी।
यदि मुझे कोई गलत धारणा है तो मुझे बताएं।
मुझे लगता है कि आप http://akrzemi1.wordpress.com/2011/05/11/parsing-strings-at-compile-time-part-i/ – Cubbi
स्ट्रिंग लिटरेल्स 'कॉन्स्ट चार से 'स्ट्रॉप' की तलाश में हैं (और वार) [एन] '_are_ 'constexpr' स्ट्रिंग प्रकार। –
जब आप लोगों को अनुमोदित होने से पहले 'स्थिर अगर' जैसी सुविधाओं का उपयोग करना शुरू करते हैं तो आपको प्यार करना होगा! –