2010-02-28 12 views
11

मैं अक्सर एसटीएल एल्गोरिदम के साथ उपयोग की जाने वाली फ़ंक्शन ऑब्जेक्ट्स देखता हूं। क्या इन एल्गोरिदम की वजह से फ़ंक्शन ऑब्जेक्ट्स आए थे? आप C++ में फ़ंक्शन ऑब्जेक्ट का उपयोग कब करते हैं? इसका क्या फायदा है?आप C++ में फ़ंक्शन ऑब्जेक्ट्स का उपयोग कब करते हैं?

+0

यह भी देखें: http://stackoverflow.com/questions/356950/c-functors-and-their-uses –

उत्तर

9

जैसा कि कहा गया jdv, फ़ंक्शन पॉइंटर्स के बजाय फ़ैक्टर का उपयोग किया जाता है, जो संकलक के लिए अनुकूलन और इनलाइन करना कठिन होता है; इसके अलावा, मज़दूरों का एक मौलिक लाभ यह है कि वे आसानी से पर कॉल के बीच एक राज्य को सुरक्षित रख सकते हैं, ताकि वे दूसरी बार कॉल किए जाने के आधार पर अलग-अलग काम कर सकें, उनके द्वारा उपयोग किए गए पैरामीटर का किसी भी तरह ट्रैक रखें .. ।

उदाहरण के लिए, आप कुछ इस तरह कर सकते हैं अगर आप ints के दो कंटेनरों में सभी तत्वों को योग करने के लिए करना चाहते हैं:

struct 
{ 
    int sum; 
    void operator()(int element) { sum+=element; } 
} functor; 
functor.sum=0; 
functor = std::for_each(your_first_container.begin(), your_first_container.end(), functor); 
functor = std::for_each(your_second_container.begin(), your_second_container.end(), functor); 
std::cout<<"The sum of all the elements is: "<<functor.sum<<std::endl; 

  1. वास्तव में, के रूप में आर शमूएल Klatchko नीचे ने कहा, वे कई स्वतंत्र स्टेट का समर्थन कर सकते हैं es, प्रत्येक मज़ेदार उदाहरण के लिए एक:
    थोड़ा और सटीक बयान यह है कि मज़ेदार कई स्वतंत्र राज्यों का समर्थन कर सकते हैं (फ़ंक्शंस स्टेटिक्स/ग्लोबल्स के माध्यम से एक एकल राज्य का समर्थन कर सकते हैं जो न तो थ्रेड-सुरक्षित और न ही पुनर्वित्त है)।
    फ़ंक्शंस आपको और भी जटिल राज्यों का उपयोग करने में सक्षम बनाता है, उदाहरण के लिए एक साझा राज्य (स्थैतिक फ़ील्ड) और एक निजी स्थिति (उदाहरण फ़ील्ड)। हालांकि यह और लचीलापन शायद ही कभी इस्तेमाल किया जाता है।
+2

थोड़ा और सटीक बयान यह है कि मज़ेदार कई स्वतंत्र राज्यों का समर्थन कर सकते हैं (फ़ंक्शंस स्टेटिक्स/ग्लोबल्स के माध्यम से एक एकल राज्य का समर्थन कर सकते हैं जो न तो थ्रेड-सुरक्षित और न ही पुनर्वित्त है)। –

+0

निश्चित रूप से आपका मतलब है कि फ़ंक्शन पॉइंटर्स अनुकूलित करना और इनलाइन करना कठिन है? जिस तरह से यह अब लिखा है, यह थोड़ा अस्पष्ट है। – jalf

+0

मेरा मतलब था कि फंक्शन पॉइंटर्स को अनुकूलित और इनलाइन करना कठिन होता है; यह मेरे लिए अस्पष्ट प्रतीत नहीं होता है, "वह" पिछले वाक्य के अंतिम वाक्यांश को संदर्भित करता है, यानी "फ़ंक्शन पॉइंटर्स"। हालांकि अगर आप एक बेहतर वाक्यांश का सुझाव देना चाहते हैं तो मुझे संपादित करने में खुशी होगी। :) –

2

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

हालांकि, मैं boost::bind का उपयोग करें और के बजाय एसटीएल एल्गोरिदम करने के लिए एक समारोह बाध्य करने के लिए पसंद करते हैं।

std::vector<int> someList; 
int total = 0; 
std::for_each(someList.begin(), someList.end(), [&total](int x) { 
    total += x; 
}); 
std::cout << total; 

सूचना है कि बंद होने की वजह से, वे बाँध का प्रतिबंध नहीं है:

std::for_each(callback.begin(), callback.end(), 
    boost::bind(&Callback::call(),_1) 
); 

इसके अलावा, एक और आगामी विकल्प लैम्ब्डा (उदाहरण के बेशर्म विकिपीडिया से चोरी) C++ 0x में की हैं एक राज्य नहीं होने के बारे में।

8

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

+0

+1 - के लिए उल्लेख इनलाइन करने –

+0

तो मुझे लगता है कि functors उनकी दक्षता के लिए और अधिक उपयोग किया जाता है ... – jasonline

+0

@ जेसनलाइन: यह एकमात्र लाभ नहीं है, लेकिन कई मामलों में यह प्राथमिक लाभ है। –

1

मैं नहीं कह सकता कि वे क्यों आए - संभवतः बस क्योंकि वे कर सकते थे!

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

सीआरटीएस qsort कॉल के साथ सॉर्ट एल्गोरिदम की तुलना करें। वे वही काम करते हैं, केवल इसे अलग-अलग करते हैं।

2

एक फ़ंक्शन ऑब्जेक्ट एक ऐसा फ़ंक्शन है जो एक ऑब्जेक्ट है, यानी यह राज्य है।सामान्य कार्यों में आम तौर पर राज्य नहीं होता है। वे वैश्विक चर का उपयोग करके राज्य को अनुकरण कर सकते हैं, लेकिन फिर राज्य सभी आमंत्रणों में साझा किया जाता है।

2

किसी ऑब्जेक्ट के रूप में फ़ंक्शन को एन्सेप्लेट करने का विचार लिस्प और स्मॉलटॉक पर वापस आता है। 1 99 1 में जिम कॉप्लिएन की पुस्तक Advanced C++ Programming Styles and Idioms में मज़ेदार का सी ++ विचार एक अध्याय था। एसटीएल ने मुहावरे का इस्तेमाल किया और इसे और लोकप्रिय बनाया।

1

This article फ़ंक्शन ऑब्जेक्ट्स पर बहुत गहराई से दिखता है, और यह कोड को और अधिक शक्तिशाली और क्लीनर भी बना सकता है।

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