ऑपरेटर() को ओवरलोड करने पर प्राथमिक लक्ष्य में से एक एक मज़ेदार बनाना है। एक मज़ेदार एक समारोह की तरह कार्य करता है, लेकिन इसमें फायदे हैं कि यह राज्यपूर्ण है, जिसका अर्थ है कि यह कॉल के बीच अपने राज्य को प्रतिबिंबित करने वाले डेटा को रख सकता है।
struct Accumulator
{
int counter = 0;
int operator()(int i) { return counter += i; }
}
...
Accumulator acc;
cout << acc(10) << endl; //prints "10"
cout << acc(20) << endl; //prints "30"
functors भारी सामान्य प्रोग्रामिंग के साथ उपयोग किया जाता है:
यहाँ एक सरल functor उदाहरण है। कई एसटीएल एल्गोरिदम एक बहुत ही सामान्य तरीके से लिखे जाते हैं, ताकि आप अपने स्वयं के फ़ंक्शन/फ़ंक्शन को एल्गोरिदम में प्लग-इन कर सकें। उदाहरण के लिए, एल्गोरिदम std :: for_each आपको किसी श्रेणी के प्रत्येक तत्व पर एक ऑपरेशन लागू करने की अनुमति देता है। यह ऐसा ही कुछ लागू किया जा सकता:
template <typename InputIterator, typename Functor>
void for_each(InputIterator first, InputIterator last, Functor f)
{
while (first != last) f(*first++);
}
आप देखते हैं कि इस एल्गोरिथ्म बहुत सामान्य है, क्योंकि यह एक समारोह से parametrized है। ऑपरेटर() का उपयोग करके, यह फ़ंक्शन आपको या तो एक फ़ैक्टर या फ़ंक्शन पॉइंटर का उपयोग करने देता है। यहाँ दोनों संभावनाओं दिखा एक उदाहरण है:
void print(int i) { std::cout << i << std::endl; }
...
std::vector<int> vec;
// Fill vec
// Using a functor
Accumulator acc;
std::for_each(vec.begin(), vec.end(), acc);
// acc.counter contains the sum of all elements of the vector
// Using a function pointer
std::for_each(vec.begin(), vec.end(), print); // prints all elements
() ऑपरेटर बारे में अपने प्रश्न अधिक भार के संबंध में, अच्छी तरह से हाँ यह संभव है। जब तक आप विधि ओवरलोडिंग के मूल नियमों का सम्मान नहीं करते हैं, तब तक आप एक ऐसे फ़ैक्टर को पूरी तरह से लिख सकते हैं, जिसमें कई ब्रांड्स ऑपरेटर हैं (उदाहरण के लिए केवल रिटर्न प्रकार पर ओवरलोडिंग संभव नहीं है)।
स्रोत
2008-11-25 14:29:56
संबंधित http://stackoverflow.com/questions/356950/c-functors-and-their-uses? – Konrad