2016-07-06 22 views
31

चलो कहते हैं कि हम इस तरह एक वर्ग टेम्पलेट करते है <int(int)> को छोड़ने का कोई तरीका है क्योंकि एक संकलक ::close के लिए यह जानकारी जान सकता है? टेम्पलेट के "डिज़ाइन" को सहेजने की कोई आवश्यकता नहीं है।कटौती

कंक्रीट कार्य के लिए, मुझे कक्षा के एक टेम्पलेट को डिजाइन करने की आवश्यकता है। इस कक्षा के ऑब्जेक्ट्स इस समारोह के लिए निर्माण समय पर एक फ़ंक्शन और पैरामीटर ले सकते हैं और बाद में इस फ़ंक्शन को कॉल कर सकते हैं।

उत्तर

35

नहीं, आप (वर्तमान में) नहीं कर सकते हैं।

template<typename F, typename... Args> 
A<std::decay_t<F>> make_A (F &&f, Args&&... args) { 
    return {std::forward<F>(f), std::forward<Args>(args)...}; 
} 

सी ++ 17 template argument deduction for class जो आप वास्तव में आप क्या चाहते हैं करने की अनुमति देगा का परिचय देंगे: ऐसा करने का मानक तरीका "make_like" समारोह (जैसे make_pair, make_optional ...) बनाने के द्वारा है।

+0

मेरा मानना ​​है कि उन कारखाने के कार्यों को बनाने का उचित तरीका 'std :: decay' या' 'पर समान विशेषता का उपयोग करना है। जो इसे 'ए > 'बना देगा। Http://en.cppreference.com/w/cpp/utility/optional/make_optional या अन्य 'make_ * 'संदर्भ – KABoissonneault

+0

@KABoissonneault हाँ आप सही हैं, अगर मैं सार्वभौमिक संदर्भों का उपयोग करता हूं तो मुझे' std :: decay' का उपयोग करना चाहिए , मैंने जवाब अपडेट किया है। – Holt

+0

मुझे सवाल समझ में नहीं आया, और इसलिए जवाब। क्या पूरा लक्ष्य 'ऑटो ए (:: क्लोज़, 1)' कहने में सक्षम होना है? – Assimilater

11

आप टेम्पलेट वर्ग के तर्कों को छोड़ नहीं सकते हैं, जब तक वे डिफॉल्ट नहीं होते हैं। आप क्या कर सकते हैं एक निर्माता कार्य है जो तर्क को कम करता है और इस तर्क को टेम्पलेट वर्ग में आगे बढ़ाता है, उचित तत्कालता की वस्तु को वापस कर देता है।

template<typename F, typename... Args> 
A<F> make_A(F f, Args&&... args) { 
    return A<F>(f, std::forward<Args>(args)...); 
} 
15

निर्माताओं के लिए टेम्पलेट पैरामीटर कटौती, सी ++ 17 में की गोद लेने के लिए धन्यवाद, आप सिर्फ लिखने के लिए सक्षम हो जाएगा:

A a(::close, 1); 

इससे पहले, आप बस के लिए एक कारखाने में लिखने के लिए की आवश्यकता होगी आप के लिए कटौती कार्य करें:

template <class F, class... Args> 
A<std::decay_t<F>> make_a(F&& f, Args&&... args) { 
    return {std::forward<F>(f), std::forward<Args>(args)...}; 
} 

auto a = make_a(::close, 1); 

यह एक छोटे से वर्बोज़ है, लेकिन कम से कम आप दक्षता के बारे में चिंता करने की जरूरत नहीं है - क्या यहां RVO करने के लिए धन्यवाद बनाया कोई प्रतियां हो जाएगा।

+1

पुन: सी ++ 17: यह बहुत अजीब है। ऐसा लगता है कि आपको कम से कम 'ए ए (:: बंद, 1) लिखना होगा; '। हालांकि मुझे लगता है कि मैं इसका इस्तेमाल करूंगा। । । – ruakh

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