2010-08-10 25 views
8

मैं टेम्पलेट के साथ एक छोटे से समस्या है:सी ++ खाका डिफ़ॉल्ट निर्माता

template <typename T> 
T Func(){ 
    std::string somestr = ""; 
    // somestr = ... 
    if (somestr != ""){ 
     return boost::lexical_cast<T>(somestr); 
    } 
    else{ 
     T ret; // warning: "ret may be uninitialized in this function" 
     return ret; 
    } 
} 

इस समारोह एक परिणाम प्राप्त करने के लिए विफल रहता है, मैं एक वैध वस्तु वापस जाने के लिए चाहते हैं, लेकिन संभव के रूप में खाली। अगर मैं इसे ऊपर की तरह करता हूं, तो मुझे चेतावनी मिलती है "इस फ़ंक्शन में रेट को अनियमित किया जा सकता है"। Try-Catch चेतावनी को हटाने में मदद नहीं करता ..

क्या सी # में default कीवर्ड की तरह इसका कोई तरीका है?

return default(T); // C# 

धन्यवाद!

उत्तर

21

ret अनियमित हो सकता है क्योंकि T एक पीओडी प्रकार या अन्य प्रकार हो सकता है जिसमें उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर नहीं हैं।

तुम इतनी तरह डिफ़ॉल्ट निर्माता आह्वान कर सकते हैं (और किसी भी पॉड प्रकार वस्तु मूल्य आरंभ कर देगा):

T ret = T(); 
return ret; 

या, और अधिक संक्षेप,

return T(); 

मतलब यह है कि T डिफ़ॉल्ट-constructible है । यदि आपको इस फ़ंक्शन को उस प्रकार के साथ तुरंत चालू करने की आवश्यकता हो सकती है जो डिफ़ॉल्ट कन्फर्मिबल नहीं है, तो आप पैरामीटर के रूप में "डिफ़ॉल्ट" केस ले सकते हैं। उदाहरण के लिए,

template <typename T> 
T Func(const T& default_value = T()) 
{ 
    // ... 
} 

यह आप अभी भी प्रकार है कि डिफ़ॉल्ट constructible हैं के लिए Func() फोन करने की अनुमति देगा, लेकिन यह भी स्पष्ट रूप से प्रकार है कि नहीं कर रहे हैं के लिए वापस जाने के लिए एक मूल्य प्रदान करने के लिए।

+2

बहुत अच्छा जवाब जेम्स। – user373215

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