लेने कहते हैं कि हम, एक वर्ग है कि उत्पादनइंटरफेस डिजाइन: अतिभारित समारोह की सुरक्षा स्ट्रिंग और चार सरणी
class Writer
{
public:
int write(const std::string& str);
int write(const char* str, int len);
//...
};
मैं इस के साथ ठीक इसके लचीला था, के लिए सामग्री लिखते हैं और जो कुछ कर सकते हैं जब तक मैं
का एहसासchar* buf = new char[n]; //not terminated with '\0'
//load up buf
Writer w;
w.write(buf); //compiles!
यह वास्तव में गंदा बग है।
हम कुछ templating
class WriterV2
{
public:
int write(const std::string& str);
int write(const char* str, int len);
template<typename... Args>
int write(const char*, Args...)
{ static_assert(sizeof...(Args) < 0, "Incorrect arguments"); }
//...
};
साथ कुछ हद तक संशोधन कर सकते हैं लेकिन इस विधि अपनी समस्याओं
WriterV2 w;
w.write("The templating genius!"); //compile error
मुझे क्या करना चाहिए है? एक बेहतर डिजाइन क्या है?
और किसी से पूछने से पहले, const char (&)[N]
does not work के लिए ओवरलोडिंग। ऐसा करने के लिए एक रैपर बनाने के लिए संभव हो सकता है, लेकिन ऐसा लगता है ... overkill?
EDIT एक विधि write(char*)
जोड़ने और एक त्रुटि उत्सर्जित आदर्श नहीं है। buf
को फ़ंक्शंस के माध्यम से पास करते समय और यह सब const char*
हो सकता है।
क्यों आप इस मामले को संभालने के लिए एक विधि घोषित नहीं करते हैं लेकिन इसे लागू नहीं करते हैं? int लिखना (char * str); – ifma
ठीक है, लेकिन दो प्रकार के बीच एक भेद क्यों होना चाहिए? साथ ही, 'w.write (buf) को कॉल करना; '_always_ call' int Writer :: लिखना होगा (const std :: string & str); 'यदि आप इसे' int Writer :: लिखना चाहते हैं (const char * str, int len) ; ', फिर अपने कॉल में लम्बाई पैरामीटर जोड़ें। – InternetAussie
बफर के रूप में std :: vector का उपयोग करें। –