2012-08-04 23 views
9

मैं सिर्फ read किसी एक निर्माता के साथ एक वर्ग फोन और एक operator() एक विधेय:एक भविष्यवाणी और एक कार्यकर्ता के बीच क्या अंतर है?

// Example 
class Foo { 
    public: 
    Foo(Bar); 
    bool operator()(Baz); 
    private: 
    Bar bar; 
}; 

हालांकि, मैं शब्द विधेय से पहले इस संदर्भ में इस्तेमाल किया जा रहा नहीं सुना है। मैं ऐसी चीज को फ़ैक्टर कहूंगा। मेरे लिए, भविष्यवाणी औपचारिक तर्क के डोमेन से कुछ होगा।

  • इस Foo की तरह कुछ के लिए एक आम शब्द है:

    यह निम्नलिखित प्रश्न उठाता है?

  • क्या दोनों शब्द एक दूसरे के साथ उपयोग किए जाते हैं, या क्या उनका मतलब थोड़ा अलग चीजें हैं?
  • या
    • (कुछ और बनाम bool) वापसी प्रकार करता है इसके साथ क्या करने के लिए कुछ है?
    • operator()const होने के बारे में क्या?

उत्तर

22

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

एक विधेय एक विशेष प्रकार functor की है। यह आवश्यक नहीं है bool प्रकार का मूल्य, बल्कि "बूलियन" अर्थशास्त्र के साथ किसी भी प्रकार का मूल्य। इस प्रकार को bool पर स्पष्ट रूप से परिवर्तनीय होना चाहिए।

+3

अच्छा। सामान्य अर्थ में एक मज़ेदार * कोई ऑब्जेक्ट/आर्टिफैक्ट होता है जो डिज़ाइन द्वारा फ़ंक्शन * का प्रतिनिधित्व करता है। चाहे वह सिंथैक्टिक रूप से और/या 'ऑपरेटर()' चीनी के साथ हो। –

3

दिखाया वर्ग एक functor है कि एक विधेय को लागू करता है।

predicate एक बूलियन फ़ंक्शन है।

operator() के बारे में गैर-const होने के नाते: यह आदर्श रूप से const होना चाहिए, हां।

+0

दिखाया गया वर्ग एक उदाहरण था। मैं सोच रहा हूं कि प्रत्येक भविष्यवाणी एक मजेदार है। वापसी मूल्य के अलावा बूलियन होने के अलावा क्या प्रतिबंध लागू होते हैं? क्या एक मुक्त फ़ंक्शन 'बूल' लौटाएगा, यह भी एक अनुमान होगा? – bitmask

+0

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

1

MSDN से:

विधि है कि मापदंड का एक सेट को परिभाषित करता है और निर्धारित करता है निर्दिष्ट वस्तु उन मानदंडों को पूरा करती है या प्रतिनिधित्व करता है।

http://msdn.microsoft.com/en-us/library/bfcke1bz.aspx

2

एक विधेय समारोह वस्तु की एक विशेष प्रकार का है। निकोलाई जोसुटिस द्वारा यह उत्कृष्ट column देखें।उद्धरण के लिए:

एक फ़ंक्शन ऑब्जेक्ट जो एक बूलियन मान देता है वह एक अनुमान है। यह एसटीएल के भविष्यवाणी के बारे में लगभग सभी ट्यूटोरियल, पुस्तकें और मैनुअल लिखते हैं। हालांकि, यह पूरी कहानी नहीं है।

हालांकि, वहाँ एक अतिरिक्त आवश्यकता है कि दुर्भाग्य से किसी भी मैनुअल में या सी ++ स्टैंडर्ड में उल्लेख नहीं किया है: एक विधेय हमेशा एक ही मूल्य के लिए एक ही परिणाम लौटना चाहिए।

या, सी के ++ भाषा में: आप एक निरंतर सदस्य समारोह के रूप में ऑपरेटर() घोषित करना चाहिए (और खेल परिवर्तनशील के साथ खेलते हैं या डाले नहीं)। इसी कारण से, भविष्यवाणी की एक प्रति के समान स्थिति मूल होनी चाहिए।

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

template<typename Arg0> 
struct UnaryPredicate 
: 
    public std::function<bool(Arg0 const&)> 
{ 
    bool operator()(Arg0 const& a0) const 
    { 
     return // your code here 
    } 
}; 

template<typename Arg0, typename Arg1> 
struct BinaryPredicate 
: 
    public std::function<bool(Arg0 const&, Arg1 const&)> 
{ 
    bool operator()(Arg const& a0, Arg const& a1) const 
    { 
     return // your code here 
    } 
}; 
1

के रूप में कहा गया है, एक विधेय सिर्फ एक बूलियन राज्य के लिए कुछ विश्लेषण करने के लिए एक उपयोगकर्ता की आपूर्ति के निर्देश है। तो तुम ही बात कर एक ही दो बातें हो सकता है ...

struct is_odd 
{ 
    is_odd() : count(0); 
    bool operartor() (int i) const { ++count; return (i % 2) == 1; } 

private 
    int count; 
} 

और ...

bool isOdd(int i) { return (i % 2) == 1; } 

तो, क्या functor में ऐसी क्या खास है? यदि आप इसे चाहते हैं तो यह राज्य को बनाए रखता है! इसका मतलब है कि, जबकि कोड की इन दो पंक्तियों में एक ही काम करते हैं कि (मान v एक वेक्टर है, मान 0 के साथ - 9) ...

for_each(v.begin(), v.end(), isOdd); //using C-style function pointer 

और ...

is_odd fn = for_each(v.begin(), v.end(), is_odd); //using functor 
साथ

केवल दूसरा उपयोग के मामले आप तो कॉल कर सकते हैं ...

int calls = fn.count; 

है ऐसा इसलिए है क्योंकि for_each (और साथ ही अन्य एसटीएल एल्गोरिथ्म कार्यों) functor यह अंत में इस्तेमाल किया देता है, तो अब अंतिम अवस्था पूछे जा सकता है।

नोट करने के लिए एक और अच्छी बात यह है कि दूसरे मामले में, हम "अज्ञात" ऑब्जेक्ट कहलाते हैं।

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