2015-01-08 8 views
9

निम्नलिखित कार्यक्रम अवैध है, और मैं समझता हूँ कि चाहते हैं क्यों:मैं इस फ़ंक्शन में लैम्ब्डा क्यों नहीं पारित कर सकता हूं जो std :: function लेता है?

#include <functional> 
#include <iostream> 

template<typename Result, typename Arg> 
void deduce(std::function<Result(Arg)> f) 
{ 
    std::cout << "Result: " << typeid(Result).name() << std::endl; 
    std::cout << "Arg: " << typeid(Arg).name() << std::endl; 
} 


int main() 
{ 
    auto f = [](int x) 
    { 
    return x + 1; 
    }; 

    deduce(f); 

    return 0; 
} 

clang के उत्पादन:

$ clang -std=c++11 test.cpp 
test.cpp:48:3: error: no matching function for call to 'deduce' 
    deduce(f); 
    ^~~~~~ 
test.cpp:26:6: note: candidate template ignored: could not match 'function<type-parameter-0-1 (type-parameter-0-0)>' against '<lambda at test.cpp:34:13>' 
void deduce(std::function<T2(T1)> f) 
    ^
1 error generated. 

ऐसा लगता है कि मैं std::function करने के लिए अपने लैम्ब्डा कन्वर्ट करने के लिए सक्षम होना चाहिए लगता है deduce द्वारा प्राप्त किया गया। संकलक के लिए इस मामले में उचित रूपांतरण लागू करना क्यों संभव नहीं है?

उत्तर

5

समस्या यह है कि जबकि एक लैम्ब्डा है कि एक int लेता है और एक int रिटर्न एक std::function<int(int)> में बदल हो सकता है, उसके प्रकार नहींstd::function<int(int)> है, लेकिन एक मनमाना कार्यान्वयन से परिभाषित प्रकार मुझे लगता है कि है।

आप इस प्रकार के कंपाइलर को बताकर इस प्रकार काम कर सकते हैं कि आप किस प्रकार के हैं। फिर रूपांतरण अपेक्षित के रूप में होगा।

auto f = [](int x){ return x + 1; }; 
deduce<int, int>(f); // now ok 

वैकल्पिक रूप से, f के स्थिर प्रकार पर स्पष्ट रहें।

std::function<int(int)> f = [](int x){ return x + 1; }; 
deduce(f); // now also ok 
+0

धन्यवाद। मैं समझता हूं कि प्रकार समान नहीं हैं, लेकिन मैं समझने की कोशिश कर रहा हूं कि संकलक यहां उचित रूपांतरण क्यों लागू नहीं कर पा रहा है। –

+2

समस्या तर्क मान का रूपांतरण नहीं है लेकिन टेम्पलेट पैरामीटर की कटौती है। एक बार वे जाने जाते हैं (जैसे मैंने पहले स्निपेट में दिया था), रूपांतरण ठीक है। मैं कोशिश करूंगा कि मैं यहां सटीक नियमों को देख सकता हूं जो यहां प्रभावी हैं। – 5gon12eder

+1

हां, कटौती समस्या है। यह एक सटीक कटौती हो सकता है, क्योंकि अन्यथा, सब कुछ जाता है: कोई विशेषज्ञता हो सकती है, या नहीं, निरंतर रूपांतरण हो सकता है। – Deduplicator

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