2011-12-12 16 views
5

मान लीजिए कि मेरे पास एक सदस्य चर my_struct है जो एक सदस्य चर, f संलग्न है, जो एक कार्य है। f के लिए सी ++ 11 लैम्ब्डा फ़ंक्शन होना संभव है।कैसे पता लगाया जाए कि संकलन समय पर एक प्रकार लैम्ब्डा अभिव्यक्ति है या नहीं?

चूंकि लैम्ब्डा ऑब्जेक्ट्स को असाइन करना अवैध है, इसलिए मैं my_struct के असाइनमेंट ऑपरेटर को इस तरह से कार्यान्वित करना चाहता हूं कि f एक लैम्ब्डा है, यह असाइन नहीं किया गया है।

क्या एक प्रकार का गुण is_lambda बनाना संभव है जो लैम्ब्डा-नेस के लिए एक प्रकार का निरीक्षण कर सकता है?

कोड में:

#include <type_traits> 

template<typename Function> struct is_lambda 
{ 
    // what goes here? 
}; 

template<typename Function> struct my_struct 
{ 
    Function f; 

    my_struct &do_assign(const my_struct &other, std::true_type) 
    { 
    // don't assign to f 
    return *this; 
    } 

    my_struct &do_assign(const my_struct &other, std::false_type) 
    { 
    // do assign to f 
    f = other.f; 
    return *this; 
    } 

    my_struct &operator=(const my_struct &other) 
    { 
    return do_assign(other, typename is_lambda<Function>::type()); 
    } 
}; 

उत्तर

7

, संकलक समर्थन के बिना असंभव के रूप में एक लैम्ब्डा के प्रकार के सिर्फ एक सामान्य, गैर संघ वर्ग प्रकार है।

§5.1.2 [expr.prim.lambda] p3

लैम्ब्डा अभिव्यक्ति (जो भी बंद वस्तु के प्रकार है) के प्रकार के एक अद्वितीय, अनाम nonunion वर्ग प्रकार [...]

4

है संभवतः आप गैर-असाइन करने योग्य गैर-लैम्ब्डा फ़ंक्शंस असाइन नहीं करना चाहते हैं, इसलिए आप std::is_assignable का उपयोग कर सकते हैं।

+0

यह दृश्य सी ++ 2015 में काम करता है, शायद पहले के संस्करणों में भी। बस उपयोग करना: 'std :: is_assignable :: मान'। मैंने यह तरीका यह सुनिश्चित करने के लिए किया था कि _EBO_ का उपयोग करते समय लैम्ब्डा नहीं लिया गया था। –

+0

@ मैथ्यूहोल्डर इस तरह के मेरे जवाब के बिंदु को याद करते हैं, हालांकि यह है कि आपको लैम्बडास विशेष उपचार देने की कोशिश नहीं करनी चाहिए। लैम्ब्डा से निकलने के साथ स्वाभाविक रूप से गलत कुछ भी नहीं है। इसमें कुछ पहलू हैं जो इसे मुश्किल बना सकते हैं, लेकिन वे वही पहलू गैर-लैम्ब्डा वर्गों पर लागू हो सकते हैं। तथ्य यह है कि वे असाइन नहीं किए जा सकते हैं उनमें से एक नहीं है, इसलिए आपके मामले में, मुझे लगता है कि यह पहलू नहीं है जिसे जांचना चाहिए। – hvd

+0

समझने योग्य, लेकिन एक परिस्थिति जिसने मुझे लैम्ब्डा का पता लगाने की आवश्यकता थी, एक वर्ग टेम्पलेट प्रकार तर्क के लिए फ़ंक्शनऑब्जेक्ट पास करते समय, जिसे खाली बेस अनुकूलन के लिए क्लास टेम्पलेट के बेस क्लास के रूप में उपयोग किया जाएगा। चूंकि आप कुछ स्थितियों में या कुछ कंपाइलरों पर लैम्ब्डा प्रकार का उत्तराधिकारी नहीं बना सकते हैं। चूंकि यह स्थिति सुधारती है ... अब यह कोई मुद्दा नहीं होगा। –

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

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