2014-04-17 3 views
5

क्या एक निर्माता का अधिभार बनाना संभव है जो प्रारंभकर्ता सूची में उपयोग किए जाने पर केवल एक खाली स्ट्रिंग स्वीकार करेगा?स्ट्रिंग लिटल ओवरलोडिंग

struct null_ptr_type; 

struct str 
{ 
    str(null_ptr_type*) {} 
    str(const char(&)[1]) {} 
}; 

struct config 
{ 
    str s; 
}; 

int main() 
{ 
    config c1 = {0}; // Works, implicit conversion to a null pointer 
    config c2 = {str("")}; // Works 
    config cx = {str("abc")}; // Fails (as desired) 
    config c3 = {""}; // Fails with no conversion possible 
} 

वहाँ भी गैर रिक्त स्ट्रिंग स्वीकार किए बगैर c3 काम के लिए वाक्य रचना बनाने के लिए एक तरीका है? मुझे नहीं लगता कि यह क्यों नहीं करता है, c1 काम करता है। क्या कोई नियम है जो मैं यहां लापता हूं जो इसे मना करता है?

+0

Fwiw, वी.एस. 2013 के रूप में आप के अंतर्निहित रूपांतरण का आह्वान उम्मीद करते हैं। मुझे पता नहीं है कि सबसे अच्छा संदर्भ है लेकिन यह कुछ है। –

+0

धन्यवाद, शायद मुझे यह निर्दिष्ट करना चाहिए: 'g ++ (उबंटू/लिनारो 4.7.3-2ubuntu1 ~ 12.04) 4.7.3', लेकिन सुनने के लिए अच्छा यह कहीं काम करता है। :) –

+1

क्लैंग ++ 3.5 भी इस रूपांतरण को स्वीकार करता है। – dyp

उत्तर

0

सी ++ 11 और "वर्दी प्रारंभ वाक्य रचना" का उपयोग करके आप इस काम कर सकते हैं इस धारणा है कि आप struct config के इंटरफेस को संशोधित करने में सक्षम हैं पर,:

struct config 
{ 
    str s; 

    config(str s) : s(s) {} 
}; 

int main() 
{ 
    config c1 = {0}; // Works, implicit conversion to a null pointer 
    config c2 = {str("")}; // Works 
    config cx = {str("abc")}; // Fails (as desired) 
    config c3 = {""}; // Works 
} 
संबंधित मुद्दे