2010-11-05 9 views
5

सी ++ में लैम्ब्डा फ़ंक्शन के पैरामीटर के प्रकारों तक पहुंच कैसे संभव है? निम्नलिखित काम नहीं करता है:मैं C++ 0x में लैम्ब्डा के प्रकारों तक कैसे पहुंच सकता हूं?

template <class T> struct capture_lambda { 
}; 

template <class R, class T> struct capture_lambda<R(T)> { 
    static void exec() { 
    } 
}; 

template <class T> void test(T t) { 
    capture_lambda<T>::exec(); 
} 

int main() { 
    test([](int i)->int{ return 0; }); 
} 

ऊपर संकलन नहीं करता, क्योंकि संकलक बजाय टेम्पलेट प्रोटोटाइप चुनता है विशेषज्ञता के।

क्या उपर्युक्त करने का कोई तरीका है?

जो मैं वास्तव में प्राप्त करने की कोशिश कर रहा हूं वह यह है: मेरे पास कार्यों की एक सूची है और मैं आमंत्रित करने के लिए उचित कार्य का चयन करना चाहता हूं। उदाहरण:

template <class T, class ...F> void exec(T t, F... f...) { 
    //select the appropriate function from 'F' to invoke, based on match with T. 
} 

उदाहरण के लिए, मैं समारोह है कि 'int' लेता आह्वान करने के लिए करना चाहते हैं:

exec(1, [](char c){ printf("Error"); }, [](int i){ printf("Ok"); }); 
+1

मैं थोड़ा व्यापक दृश्य मांगूंगा: 'exec' फ़ंक्शन का उपयोग करके आप हल करने का क्या प्रयास कर रहे हैं? थोड़ा बदसूरत लगता है। – GManNickG

+0

मैं बीजगणितीय संघ प्रकार बनाने की कोशिश कर रहा हूं। – axilmar

+0

मनमानी फ़ंक्शन ऑब्जेक्ट प्रकारों पर ओवरलोड रिज़ॉल्यूशन ... मैं ऐसा करने का तरीका नहीं सोच सकता। अगर वे अपने परम प्रकार निर्यात करेंगे, तो यह किया जा सकता है। अन्यथा, मेरे पास कोई सुराग नहीं है। –

उत्तर

2

यह संभव नहीं है, लैम्ब्डा कार्यों समारोह बनाने के लिए वाक्यात्मक चीनी वास्तविक कार्यों नहीं वस्तुओं रहे हैं। इसका मतलब है कि टेम्पलेट कक्षा स्वीकार कर रहा है, और कक्षाओं में तर्क प्रकार की अवधारणा नहीं है।

यह भी ध्यान रखें कि एक सामान्य फ़ंक्शन ऑब्जेक्ट में operator() एस ओवरलोड हो सकता है।