2015-11-19 8 views
6

वहाँ इस परिदृश्य में ऑटो कीवर्ड का उपयोग करने के लिए एक रास्ता है। तो, समाधान उन्हें एक वाक्य में या किसी अन्य तरीके से विलय करना चाहिए। क्या यह उपलब्ध है?उत्पादन पैरामीटर में ऑटो का उपयोग

+2

मुझे ऐसा नहीं लगता .. अगर आप 'foo'' पर अधिभार जोड़ते हैं तो क्या होगा? –

+1

यदि आप प्रोग्राम लिखते समय 'ए' के प्रकार को नहीं जानते हैं, तो आपको एक असंभव समस्या है। फ़ंक्शन के लिए समाधान टेम्पलेट्स है, लेकिन आपको उस चर के प्रकार को जानने की आवश्यकता है जिसे आप घोषित करते हैं, एक तरफ या दूसरा। –

+0

सरल उत्तर नहीं है (बीटीडब्ल्यू आप उन्हें एक वाक्य में विलय करके क्या मतलब है)। –

उत्तर

10

ऐसा लगता है कि आप डिफॉल्ट करना चाहते हैं- किसी दिए गए फ़ंक्शन को किसी तर्क के रूप में अपेक्षित प्रकार के ऑब्जेक्ट को प्रारंभ करना।

आप auto के साथ ऐसा नहीं कर सकते, लेकिन आप प्रकार एक समारोह की उम्मीद है, तो का उपयोग करें कि आपके चर घोषित करने के लिए निकालने के लिए एक विशेषता लिख ​​सकते हैं:

namespace detail { 
    //expects the argument number and a function type 
    template <std::size_t N, typename Func> 
    struct arg_n; 

    //does all the work 
    template <std::size_t N, typename Ret, typename... Args> 
    struct arg_n <N, Ret (Args...)> { 
     using type = std::remove_reference_t< 
         std::tuple_element_t<N, std::tuple<Args...>> 
        >; 
    }; 
} 

//helper to make usage neater 
template <std::size_t N, typename Func> 
using arg_n = typename detail::arg_n<N, Func>::type; 

तो फिर तुम यह इतना की तरह उपयोग करें:

//type of the first argument expected by foo 
arg_n<0,decltype(foo)> a{}; 
foo(a); 

बेशक, जैसे ही आप फ़ंक्शन को अधिभारित करते हैं, यह सब बहुत ही असफल हो जाता है।

+0

यह भयानक है हालांकि मुझे सभी पैटर्न समझ में नहीं आया लेकिन नतीजा बिल्कुल वही है जो मैं चाहता हूं। हालांकि, मुझे वास्तविक दुनिया कार्यक्रम में इसका उपयोग करने से डर है क्योंकि कोई (कुछ साल बाद) यह चाहता है कि वह व्यक्ति जो इस कोड को नरक में जाने के लिए लिखता है: डी –

+0

@ हुममहेल्फावी वास्तव में, इस तरह का कोड सामान्य संदर्भ में सामान्य है । यदि आपको लगता है कि रखरखाव इसे प्राप्त कर पाएंगे तो आपको कुछ और टिप्पणियां चाहिए। – TartanLlama

4
bar foo() 
{ 
    return bar{}; 
} 

int main() 
{ 
    auto a = foo(); 
} 

सभी आधुनिक कंपाइलर्स कॉपी-एलिशन करेंगे, बिल्कुल कोई प्रतियां नहीं होंगी।

+0

हालांकि यह ऑटो का उपयोग प्रदर्शित करता है, यह सवाल से बचाता है क्योंकि यह आउट पैरामीटर का उपयोग नहीं कर रहा है। –

+0

@ChrisBetti इस स्थिति में कुछ निर्मित उदाहरण के संदर्भ में बेहतर नहीं है, फिर इसे नया उदाहरण दें। मूल्य से बेहतर वापसी और इसे नए बनाए गए 'ऑटो' चर के लिए असाइन करें। – vladon

+0

मैं 100% आपसे सहमत हूं। –

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