2017-02-28 10 views
8

मैंने टेम्पलेट से निपटने के दौरान मुझे एक छोटी सी समस्या पर ठोकर खाई। यहाँ एक उदाहरण है:,टेम्पलेट पैरामीटर के रूप में टेम्पलेटेड फ़ंक्शन पॉइंटर

template<class _returnType, _returnType (*_function)()> 
_returnType aliasGetter() { return _function(); } 
int getCoolNumber() { return 42; } 
int main() 
{ 
    std::cout << aliasGetter<int, &getCoolNumber>(); //42 
} 

इस कोड काम करता है (http://cpp.sh/ यदि आप इसे करने की कोशिश करना चाहते हैं) लेकिन बाद से मैं टेम्पलेट पैरामीटर मैं _returnType आवश्यकता नहीं होनी चाहिए के रूप में एक समारोह सूचक देते हैं, यह समारोह हस्ताक्षर में सही नहीं है, समस्या यह है कि कोई फर्क नहीं पड़ता कि मैं कितनी मेहनत करता हूं, मुझे इस अतिरिक्त टेम्पलेट पैरामीटर से छुटकारा पाने का कोई तरीका नहीं मिल रहा है।

मैं aliasGetter कैसे बना सकता हूं केवल एक टेम्पलेट पैरामीटर (ऊतक के लिए गेटर के लिए एक सूचक) ले सकता है? यदि यह संभव नहीं है, तो क्यों नहीं?

+0

एक टेम्पलेट पैरामीटर का उपयोग करने और टेम्पलेट तर्क कटौती पर भरोसा करने के बारे में क्या? – WhiZTiM

+1

@WhiZTiM जिसे रन-टाइम पर कॉल करने के लिए फ़ंक्शन पॉइंटर को पास करने की आवश्यकता होगी। –

+0

आपको इसकी आवश्यकता है क्योंकि आपका दूसरा टेम्पलेट पैरामीटर इस पर निर्भर करता है। आप https://functionalcpp.wordpress.com/2013/08/05/function-traits/ के साथ कुछ बना सकते हैं लेकिन मुझे संदेह है कि आप टेम्पलेट पैरामीटर को सहेज लेंगे। – knivil

उत्तर

14

सी ++ 17 में, यह संभव, template auto को हो जाएगा धन्यवाद:

template <auto F> std::invoke_result_t<F> aliasGetter() { return F(); } 

से पहले सी ++ 17, यह संभव नहीं है। आपको गैर-प्रकार के टेम्पलेट पैरामीटर के प्रकार को निर्दिष्ट करने की आवश्यकता है - इसके आस-पास कोई रास्ता नहीं है। आप इसके लिए कोई फ़ैक्टरी नहीं बना सकते हैं क्योंकि आप फ़ंक्शन टेम्पलेट के माध्यम से फ़ंक्शन पॉइंटर पास नहीं कर सकते हैं और इसे गैर-प्रकार के टेम्पलेट तर्क के रूप में समाप्त कर सकते हैं।

template <class T, T F> std::result_of_t<T()> aliasGetter() { return F(); } 
#define TEMP_ALIAS(x) decltype(x), x 

std::cout << aliasGetter<TEMP_ALIAS(&getCoolNumber)>(); 

जो आप आप मैन्युअल रूप से यह दो बार टाइप करने के लिए बिना अपने समारोह सूचक के प्रकार के हो जाता है:


सी ++ 14 में कम से कम वैकल्पिक हल के लिए, आह, मैक्रो का उपयोग है।

+1

मुझे पता था कि सी + 17 के साथ आपके द्वारा वर्णित नए वाक्यविन्यास के लिए धन्यवाद संभव था, हालांकि, मैंने सोचा कि शायद, यह इस जादू चाल के बिना किया जा सकता है (यही कारण है कि मैंने सी ++ 14 टैग किया)। यह अभी भी एक अच्छा और स्पष्ट उत्तर है हालांकि – Nyashes

+0

'std :: result_of' सी ++ 17 पर [बहिष्कृत] (http://en.cppreference.com/w/cpp/types/result_of) है,' std :: invoke_result का उपयोग करें इसके बजाए –

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

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