में लैम्ब्डा पर टेम्पलेट को विशेषज्ञता देना मैंने एक विशेषता वर्ग लिखा है जो मुझे तर्कों और सी ++ 0x में फ़ंक्शन या फ़ंक्शन ऑब्जेक्ट के प्रकार (जीसीसी 4.5.0 के साथ परीक्षण) के बारे में जानकारी निकालने देता है। ।सी ++ 0x
template <typename F>
struct function_traits {
template <typename R, typename... A>
struct _internal { };
template <typename R, typename... A>
struct _internal<R (F::*)(A...)> {
// ...
};
typedef typename _internal<decltype(&F::operator())>::<<nested types go here>>;
};
तब मैं वैश्विक क्षेत्र में सादा कार्यों के लिए एक विशेषज्ञता है:
template <typename R, typename... A>
struct function_traits<R (*)(A...)> {
// ...
};
यह ठीक काम करता है, मैं टेम्पलेट या एक समारोह वस्तु और में एक समारोह पारित कर सकते हैं सामान्य मामले समारोह वस्तुओं संभालती यह ठीक से काम करता है:
template <typename F>
void foo(F f) {
typename function_traits<F>::whatever ...;
}
int f(int x) { ... }
foo(f);
क्या होगा अगर, बजाय foo
में एक समारोह या समारोह वस्तु पास करने का, मैं एक लैम्ब्डा अभिव्यक्ति पास करना चाहते हैं?
foo([](int x) { ... });
समस्या यह है कि न तो function_traits<>
का विशेषज्ञता लागू होता है। सी ++ 0 एक्स ड्राफ्ट का कहना है कि अभिव्यक्ति का प्रकार "अद्वितीय, अनामित, गैर-यूनियन क्लास प्रकार" है। अभिव्यक्ति पर typeid(...).name()
पर कॉल करने के नतीजे को झुकाव मुझे लैम्ब्डा, main::{lambda(int)#1}
के लिए जीसीसी के आंतरिक नामकरण सम्मेलन के रूप में दिखाई देता है, ऐसा कुछ नहीं जो सिंटैक्टिक रूप से सी ++ टाइपनाम का प्रतिनिधित्व करता है।
संक्षेप में, वहाँ कुछ भी मैं टेम्पलेट यहाँ में डाल सकता है:
template <typename R, typename... A>
struct function_traits<????> { ... }
कि इस लक्षण वर्ग एक लैम्ब्डा अभिव्यक्ति को स्वीकार करने की अनुमति देगा?
नहीं। आपको ऐसा क्यों लगता है कि आपको ऐसा कुछ चाहिए? – sellibitze
मैंने सोचा कि मेरे उदाहरण ने एक सभ्य उपयोग केस दिया है: यदि मेरे पास एक सामान्य एल्गोरिदम है जो फ़ंक्शन या फ़ंक्शन ऑब्जेक्ट में लेता है, तो मैं न केवल रिटर्न प्रकार (जो कि आजकल के साथ भी किया जा सकता है) निर्धारित करने के लिए इस विशेषता वर्ग का उपयोग कर सकता है, लेकिन तर्क के प्रकार भी। (मैंने पद को बहुत लंबे समय तक रखने के लिए कोड का बड़ा हिस्सा छोड़ा।) चूंकि मैं ऑर्थोगोनैलिटी उद्देश्यों के लिए एक फ़ंक्शन या फ़ंक्शन ऑब्जेक्ट में पास कर सकता हूं, इसलिए मैं लैम्ब्डा में भी पास करने में सक्षम होना चाहता हूं। यह मूल रूप से एक अकादमिक अभ्यास है जो "प्रोग्रामिंग के तत्व" पढ़ने से उत्पन्न हुआ है। –
@ टोनी: जवाब हाँ है, मैंने इसे किया है। हालांकि, मैं थोड़ी देर बाद इस सवाल पर वापस आ पाऊंगा। आप क्या गुण प्राप्त करने की कोशिश कर रहे हैं? – GManNickG