2009-05-28 6 views
8

हमारे कोड में हम इस पद्धति से काफी कुछ मामलों है को रोकने के लिए:क्या इस पैटर्न की बात है: एक struct का उपयोग कर एक एकल विधि

class outerClass 
{ 
    wstring changeString(wstring value) 
    { 
     //do something 
     return value; 
    } 

    void doThing() 
    { 
     wstring initialValue; 
     wstring finalValue = changeString(initialValue); 
    } 
}; 
:

class outerClass 
{ 
    struct innerStruct 
    { 
     wstring operator()(wstring value) 
     { 
      //do something 
      return value; 
     } 
    }; 

    void doThing() 
    { 
     wstring initialValue; 
     wstring finalValue = innerStruct()(initialValue); 
    } 
}; 

पर इस का लाभ क्या है

+0

कोड लिखने वाले व्यक्ति से क्यों नहीं पूछें? –

+0

क्योंकि वे – Ant

+0

ओह उपलब्ध नहीं हैं। कोड को अधिक ध्यान से कॉपी करना सीखना चाहिए :) – Ant

उत्तर

4

यह templated भविष्यवाणियों के लिए एक अनुकूलन कदम है।

फ़ंक्शन की तुलना में किसी मज़ेदार का उपयोग करना आसान नहीं है। दोनों बूस्ट और एसटीएल संदर्भों में काफी समान काम करते हैं।

टेम्पलेट तत्कालता में वे अलग-अलग कैसे हैं।

एक छोटी सी टेम्पलेट समारोह है कि एक विधेय

template< typename Predicate > 
void DoSomething(Predicate func) 
{ 
    func(); 
} 

की आवश्यकता है एक समारोह का उपयोग करते हुए एक समारोह सूचक के साथ एक टेम्पलेट उदाहरण का दृष्टांत होगा कल्पना कीजिए।

void changeString(); 

DoSomething(&changeString); 

// This creates a template instantiation expecting a pointer to a function. 
// The specific pointer may be evaluated at runtime. 

// void DoSomething(void(func*)()); 

एक functor का उपयोग करते हुए एक विशिष्ट functor प्रकार के साथ एक टेम्पलेट उदाहरण का दृष्टांत होगा।

struct changeString 
{ 
    void operator()(); 
} 

DoSomething(changeString()); 

// This creates a template instantiation expecting an instance of the struct. 
// The exact function being called is now known at compile time. 

// void DoSomething(changeString); 
functor साथ

, विशिष्ट कार्यक्षमता अब अच्छी तरह से परिभाषित किया गया है और struct पारित किया जा रहा है की संभावना का उपयोग नहीं किया और बाहर अनुकूलित किया जा सकता है।

+1

बहुत स्पष्ट धन्यवाद। – Ant

16

ऑपरेटर() के साथ एक स्ट्रक्चर को अक्सर एक फंक्शन कहा जाता है, जो प्रभावी रूप से "फंक्शन ऑब्जेक्ट" के रूप में कार्य करता है। आप इन फंक्शंस का उपयोग कई एपीआई, विशेष रूप से एसटीएल के साथ कर सकते हैं, आप सामान्य फ़ंक्शन पॉइंटर्स का उपयोग कर सकते हैं। फंक्शंस ऑब्जेक्ट्स होते हैं, उनमें राज्य शामिल हो सकता है, और स्वयं निहित विशेष हैंडलर बनाने के लिए निर्माण के दौरान पैरामीटर किया जा सकता है।

मुझे लगता है कि अक्सर बार-बार, आपके पास बाहरी क्लास में कोड होता है जो इन लाइब्रेरी फ़ंक्शंस (यानी std :: for_each) का उपयोग करना चाहता है, और इसलिए इस पैटर्न को इसे छोटा बनाने के लिए विकसित किया है। यदि आप कभी भी म्यूटर्स का उपयोग नहीं करते हैं, तो हाँ, यह वाक्यविन्यास व्यर्थ और पढ़ने के लिए कठिन है (और जैसा कि आप सुझाव देते हैं) को बदला जा सकता है।

संपादित करें: आपको Question 317450, ऑपरेटर() के बारे में पसंद हो सकता है।

+0

आह जो समझ में आता है धन्यवाद! मुझे लगता है कि कुछ स्थानों पर यह उस कारण से है, लेकिन दूसरों में यह सिर्फ कॉपी किया गया है (पैटर्न, कोड नहीं)। – Ant

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