स्वीकार कर रहा है क्या केवल स्ट्रिंग को शाब्दिक रूप से स्वीकार करता है, लेकिन उदाहरण के लिए नहीं। char const *
?सी ++: कन्स्ट्रक्टर केवल एक स्ट्रिंग शाब्दिक
क्या दो अधिभार होना संभव है जो स्ट्रिंग अक्षर और char const *
के बीच अंतर कर सकते हैं?
सी ++ 0x एक कस्टम प्रत्यय के साथ इसे अनुमति देगा - लेकिन मैं एक "पहले" समाधान की तलाश में हूं।
तर्क: तारों की ढेर प्रतिलिपि से परहेज करते हुए स्ट्रिंग अक्षर के रूप में दिए जाने पर संशोधित नहीं किया जाएगा।
ये स्ट्रिंग सीधे किसी एपीआई पर const char *
किसी भी प्रसंस्करण के बिना उम्मीद कर रही हैं। अधिकतर कॉल उन अक्षरों का उपयोग करते हैं जिनके लिए कोई अतिरिक्त प्रसंस्करण की आवश्यकता नहीं होती है, केवल कुछ मामलों में उनका निर्माण होता है। मैं मूल कॉल व्यवहार को संरक्षित करने की संभावना तलाश रहा हूं।
नोट: - के बाद से यह जवाब में आता है: प्रश्न में कोड std::string
बिल्कुल का उपयोग नहीं करता है, लेकिन एक अच्छा उदाहरण होगा:
class foo
{
std::string m_str;
char const * m_cstr;
public:
foo(<string literal> s) : m_cstr(p) {}
foo(char const * s) : m_str(s) { m_cstr = s.c_str(); }
foo(std::string const & s) : m_str(s) { m_cstr = s.c_str(); }
operator char const *() const { return m_cstr; }
}
परिणाम:
(1) यह नहीं किया जा सकता है।
(2) मुझे एहसास हुआ कि मैं एक शाब्दिक भी नहीं ढूंढ रहा हूं, लेकिन एक संकलन-समय-निरंतर (यानी "कुछ भी जिसे कॉपी नहीं किया जाना चाहिए")।
मैं शायद निम्नलिखित पैटर्न के बजाय का उपयोग करेगा:
const literal str_Ophelia = "Ophelia";
void Foo()
{
Hamlet(str_Ophelia, ...); // can receive literal or string or const char *
}
एक सरल
struct literal
{
char const * data;
literal(char const * p) : data(p) {}
operator const char *() const { return data; }
};
कि यह दुरुपयोग करने से किसी को भी नहीं रुकती साथ (मैं एक बेहतर नाम खोजना चाहिए ...) , लेकिन यह आवश्यक अनुकूलन की अनुमति देता है लेकिन डिफ़ॉल्ट रूप से सुरक्षित रहता है।
मुझे ऐसा नहीं लगता है, क्योंकि 'स्ट्रिंग' एक निर्माता है कि लेता है एक 'चार कॉन्स * '। –
क्या आप तर्क पर विस्तार कर सकते हैं? मैं काफी नहीं देख सकता कि आप एक स्ट्रिंग अक्षर की प्रतिलिपि बनाना क्यों चाहते हैं, लेकिन 'कॉन्स्ट char *' (या दूसरी तरफ) की प्रतिलिपि न लें। आपको बिल्कुल वही तरीके से बदलने की अनुमति नहीं है। – Hexagon
आपको एक ध्वज बनाए रखना होगा और आपके विनाशक में सशर्त कोड होना होगा। ऐसा लगता है कि स्ट्रिंग अक्षर का उपयोग करके आपको बहुत अधिक ऑब्जेक्ट्स बनाना होगा, आमतौर पर मैं इसे सार्थक बनाने के लिए करता हूं। –