2012-04-23 30 views
11

मैं वर्तमान में बूस्ट :: एमपीएल के साथ अवधारणा के नमूने पर कुछ सबूत कर रहा हूं और मुझे यह समझने में कुछ कठिनाइयों का सामना करना पड़ रहा है कि लैम्ब्डा फ़ंक्शन प्लेसहोल्डर्स के उपयोग को कैसे सक्षम बनाता है।बूस्ट एमपीएल प्लेसहोल्डर और लैम्ब्डा

मुझे एहसास है कि मैं उच्चतम कार्य फ़ंक्शंस को नेस्टेड लागू फ़ंक्शन तक पहुंचने में सक्षम होने के लिए मेटाफंक्शन कक्षाओं में मेटाफंक्शन को लपेट सकता हूं, और महसूस किया है कि आप एमपीएल :: लैम्ब्डा को मेटाफंक्शन को लपेटने के लिए इस प्रयास से बच सकते हैं जो जगह की अनुमति देता है धारकों।

यह वास्तव में कैसे काम करता है? मुझे अपने सिर को लपेटने में परेशानी हो रही है कि लामा और प्लेसहोल्डर वास्तव में कवर के तहत क्या करते हैं।

उत्तर

13

Boost.MPL manual देखें: प्लेसहोल्डर mpl::arg<X> रूप का एक मेटाफंक्शन वर्ग है। एक मेटाफंक्शन वर्ग एक कक्षा है जिसमें apply मेटाफंक्शन होता है।

template <int N> struct arg; // forward declarations 
struct void_; 

template <> 
struct arg<1> 
{ 
    template < 
     class A1, class A2 = void_, ... class Am = void_> 
    struct apply 
    { 
     typedef A1 type; // return the first argument 
    }; 
}; 
typedef arg<1> _1 

यह metafunction वर्गों में प्लेसहोल्डर भाव चालू करने के लिए mpl::lambda का काम है। यह this की तरह एक metafunction वर्ग embedding द्वारा किया जाता है:

template< 
     typename X 
    , typename Tag = unspecified 
    > 
struct lambda 
{ 
    typedef unspecified type; 
}; 

यदि x एक सामान्य रूप X<a1,...an>, जहां X एक वर्ग टेम्पलेट है और a1,... an मनमाना प्रकार के होते हैं में एक प्लेसहोल्डर अभिव्यक्ति है, एम्बेडेड अनिर्दिष्ट प्रकार f के बराबर है

typedef protect< bind< 
     quoten<X> 
    , lambda<a1>::type,... lambda<an>::type 
> > f; 

अन्यथा, fX के समान है। apply मेटाफंक्शन एम्बेडेड प्रकार तक पहुंचकर लैम्ब्डा अभिव्यक्ति का मूल्यांकन करता है।

एमपीएल manual में आप protect, bind और quote की परिभाषाओं को भी देख सकते हैं। जब तक संभव हो सके मूल्यांकन में देरी करने के लिए वे अपने तर्कों के चारों ओर सभी रैपर हैं।

+0

स्पष्ट और संक्षिप्त उत्तर - ओपी द्वारा स्वीकार किया जाना चाहिए था। – etherice

+0

धन्यवाद, मदद करने में खुशी हुई! – TemplateRex