2012-06-03 11 views
15

नीचे दिए गए कोड उदाहरण में, foo पर कॉल काम करता है, जबकि bar पर कॉल विफल हो जाता है।एक फ़ंक्शन को एक स्पष्ट टेम्पलेट पैरामीटर के रूप में पास करें

अगर मैं bar पर कॉल पर टिप्पणी करता हूं, तो कोड संकलित करता है, जो मुझे bar की परिभाषा बताता है ठीक है। तो bar सही तरीके से कैसे कहा जाएगा?

#include <iostream> 

using namespace std; 

int multiply(int x, int y) 
{ 
    return x * y; 
} 

template <class F> 
void foo(int x, int y, F f) 
{ 
    cout << f(x, y) << endl; 
} 

template <class F> 
void bar(int x, int y) 
{ 
    cout << F(x, y) << endl; 
} 

int main() 
{ 
    foo(3, 4, multiply); // works 
    bar<multiply>(3, 4); // fails 

    return 0; 
} 
+0

यह भी देखें [फ़ंक्शन तर्क टेम्पलेट के रूप में पारित किया गया] [https://stackoverflow.com/q/1174169/608639)। – jww

उत्तर

26

समस्या यहाँ है, multiply एक प्रकार नहीं है; यह मान है लेकिन फ़ंक्शन टेम्पलेट bar टेम्पलेट तर्क टाइप करने की अपेक्षा करता है। इसलिए त्रुटि।

आप के रूप में समारोह टेम्पलेट को परिभाषित हैं:

template <int (*F)(int,int)> //now it'll accept multiply (i.e value) 
void bar(int x, int y) 
{ 
    cout << F(x, y) << endl; 
} 

तो यह काम करेंगे। ऑनलाइन डेमो देखें: http://ideone.com/qJrAe

आप के रूप typedef का उपयोग कर वाक्य रचना को आसान बनाने में कर सकते हैं:

typedef int (*Fun)(int,int); 

template <Fun F> //now it'll accept multiply (i.e value) 
void bar(int x, int y) 
{ 
    cout << F(x, y) << endl; 
} 
+2

स्पष्ट स्पष्टीकरण के लिए धन्यवाद! – tajmahal

7

multiply एक प्रकार नहीं है, यह एक समारोह है। उस संदर्भ में, यह एक फ़ंक्शन पॉइंटर को क्षय करता है। हालांकि, bar एक प्रकार के लिए टेम्पलेट किया गया है, फिर, multiply नहीं है।

नवाज पहले से ही सवाल दूसरी तरह के आसपास जवाब (कैसे कार्यों के साथ प्रयोग की जाने वाली bar की परिभाषा को बदलने के लिए), लेकिन कैसे bar तुम्हारे पास है, तब तक आप एक उपयुक्त प्रकार की जरूरत है कॉल करने के लिए की आपकी स्पष्ट सवाल का जवाब देने, इस तरह:

struct Type { 
    const int result; 
    Type(int x, int y): result(x * y) {} 
    operator int() const { return result; } 
}; 

// usage 
bar<Type>(x, y); 

// (edit) a suitable type doesn't necessarily mean a new type; this works as well 
// if you aren't trying to solve any specific problem 
bar<std::string>(64, 64); 
+0

यदि वह इसका उपयोग करने जा रहा है, तो उसे 'बार' भी बदलना होगा। वाक्यविन्यास 'एफ (एक्स, वाई) '' एफ (एक्स, वाई)() 'होना चाहिए। – Nawaz

+0

@ नवाज़ नहीं, 'टाइप' वास्तव में एक मजेदार नहीं है। यह एक उपयुक्त कन्स्ट्रक्टर और स्ट्रीम आउटपुट ओवरलोड के साथ सिर्फ एक प्रकार है (इस मामले में एक उपयुक्त रूपांतरण ऑपरेटर जिसमें पहले से ही स्ट्रीम आउटपुट अधिभार है)। (http://ideone.com/AgQGc देखें) –

+0

ओह .. मैंने इसे अनदेखा किया ... संभवतः क्योंकि एक मजेदार यहां एक बेहतर विकल्प होगा, इसलिए मैं इसकी अपेक्षा कर रहा था। – Nawaz

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