2010-02-05 16 views
9

मान लीजिए मैं इस वर्ग है:सशर्त ऑपरेटर

class foo 
{ 
public: 
    foo() { } 
    foo(const std::string& s) : _s(s) { } 

private: 
    std::string _s; 
}; 

कौन सा अन्य वर्ग का एक सदस्य है:

class bar 
{ 
public: 
    bar(bool condition) : 
     _f(condition ? "go to string constructor" : **go to empty ctor**) 
    { 
    } 

private: 
    foo _f; 
}; 

जब _fbar में के सदस्य प्रारंभ सूची मैं करूंगा आरंभ condition के आधार पर आमंत्रित करने के लिए foo का कौन सा कन्स्ट्रक्टर चुनना पसंद है।

यह काम करने के लिए मैं go to empty ctor के बजाय क्या रख सकता हूं? मैंने foo() डालने का विचार किया, क्या कोई और तरीका है?

उत्तर

14

एक सशर्त ऑपरेटर का परिणाम हमेशा एक सामान्य प्रकार को ढूंढकर संकलित समय पर निर्धारित एक निश्चित प्रकार होता है जिसे दोनों विकल्पों में परिवर्तित किया जा सकता है। (सटीक नियम थोड़ा सा शामिल हैं, लेकिन सामान्य उपयोग में यह आमतौर पर 'सही काम करता है')

आपके उदाहरण में सबसे आसान काम यह है कि उस प्रकार को अस्थायी foo हो और फिर कॉपी कन्स्ट्रक्टर का उपयोग करें बार में _f intialize करने के लिए।

आप निम्नानुसार ऐसा कर सकते हैं।

_f(condition ? foo("string") : foo()) 
+1

सी ++ 11 के साथ, मैं प्रतिलिपि बनाने वाले पर एक चालक-निर्माता की सिफारिश करता हूं, लेकिन तकनीक अच्छी है। – Richard

+1

@ रिचर्ड: मैं कॉपी कन्स्ट्रक्टर के स्पष्ट उपयोग की सिफारिश नहीं कर रहा था (यह कि मेरे ज्ञान के लिए यह संभव नहीं है)। मैंने जो उदाहरण दिखाया है वह उपयुक्त होने पर एक चालक कन्स्ट्रक्टर का उपयोग करेगा। –

0

तो एक खाली स्ट्रिंग गुजर कोई आर्ग निर्माता आप निम्न कर सकता है बुला के बराबर है:

_f(condition ? "string" : "") 

यह आपको प्रतिलिपि की बचत होगी।

संबंधित मुद्दे