2011-03-01 12 views
13
#include <functional> 

int func(int x, int y) 
{ 
    return x+y; 
} 

int main() 
{ 
    typedef std::function<int(int, int)> Funcp; 
    Funcp funcp = func; 

    return 0; 
} 

लेकिन क्या यह टेम्पलेट फ़ंक्शन को इंगित करना संभव है?फ़ंक्शन टेम्पलेट को इंगित करने के लिए std :: फ़ंक्शन का उपयोग कैसे करें

#include <functional> 

template<class T> 
T func(T x, T y) 
{ 
    return x+y; 
} 

int main() 
{ 
    typedef std::function<?(?, ?)> Funcp; 
    Funcp funcp = func; 

    return 0; 
} 

उत्तर

14

नहीं। एक टेम्पलेट फ़ंक्शन बिल्कुल ठीक है, एक टेम्पलेट। यह एक असली काम नहीं है। आप एक std :: फ़ंक्शन को टेम्पलेट फ़ंक्शन के विशिष्ट तत्कालता पर इंगित कर सकते हैं, उदा। func<int,int>

+7

+1। वास्तव में, शब्द "टेम्पलेट फ़ंक्शन" भ्रामक है, "फ़ंक्शन टेम्पलेट" अधिक सटीक है। – suszterpatt

+0

यह एक अच्छा जवाब है, लेकिन यह थोड़ा भ्रामक है। आप 'नहीं' कहते हैं, फिर यह बताने के लिए आगे बढ़ें कि जवाब क्यों है 'हाँ, अगर आप इसे तुरंत चालू करते हैं।' – aboveyou00

1

जैसे एरिक बताते हैं, यह सीधे संभव नहीं है। जिस प्रभाव को आप शायद चाहते हैं उसे प्राप्त करने के लिए, आपको कोड बनाना होगा जो पॉइंटर को टेम्पलेट का उपयोग करता है।

18

सी में एक टेम्पलेट समारोह के रूप में ऐसी कोई चीज नहीं है ++ — लोग क्या लापरवाही के रूप में "टेम्पलेट कार्यों" का उल्लेख वास्तव में समारोह टेम्पलेट्स हैं: टेम्पलेट्स जो कार्यों को परिभाषित।

इस प्रकार, ऊपर दिए गए आपके दूसरे उदाहरण में func कोई फ़ंक्शन नहीं है, यह एक (फ़ंक्शन) टेम्पलेट है, और इसका उपयोग फ़ंक्शन के रूप में उसी तरह नहीं किया जा सकता है। विशेष रूप से, std::function किसी फ़ंक्शन के साथ प्रदान करने की अपेक्षा करता है।

आप इस पर कैसे काम कर सकते हैं इस पर निर्भर करता है कि आप क्या हासिल करने की कोशिश कर रहे हैं। आप कोड किसी भी प्रकार से समारोह काम का उपयोग करता है बनाने के लिए कोशिश कर रहे हैं, तो आप बस एक समारोह या वर्ग टेम्पलेट में उस कोड जगह कर सकते हैं:

template <typename T> 
void use_function(T t) { 
    typedef std::function<T(T,T)> Funcp = func<T>; 
    // use Funcp here 
} 

तुम क्या करने में सक्षम नहीं होगा क्या, तथापि, है सार्वभौमिक प्रकार क्वांटिफायर ("किसी भी प्रकार पर लागू किया जा सकता है") के साथ देर से बाध्यकारी का उपयोग करें, क्योंकि "किसी भी प्रकार पर लागू किया जा सकता है" को सी ++ में संकलन-समय पर हल किया जाता है। यह ठीक है कि यह कैसे रोल करता है।

11

क्या आप यह चाहते हैं?

#include <functional> 

template<class T> 
T func(T x, T y) 
{ 
    return x+y; 
} 

template<typename T> struct FunctionType 
{ 
    typedef std::function<T(T, T)> Type ; 
} ; 

int main() 
{ 
    FunctionType<int>::Type Funcp = func<int> ; 
} 
संबंधित मुद्दे