2010-12-14 14 views
7

मैं MyClass की एक सूची है:क्या मामला बेहतर है?

struct MyClass { 
    bool is_old_result(int lifetime); 
}; 
std::list<MyClass> results; 
int lifetime = 50; // or something else 

को दूर करने के क्या मामला है बेहतर (C++ डिजाइन और कार्यक्षमता):

results.remove_if(
    std::bind2nd(std::mem_fun_ref(&MyClass::is_old_result), lifetime)); 

या

results.remove_if(boost::bind(&MyClass::is_old_result, _1, lifetime)); 

या

struct RemoveFunctor { 
    RemoveFunctor (int lifetime) : lifetime(lifetime) {} 
    bool operator()(const MyClass & m) { return m.is_old_result(lifetime); } 
private: 
    int lifetime; 
}; 
results.remove_if(RemoveFunctor(lifetime)); 

और क्यों?

पीएस कृपया, कोई लैम्ब्डा-फ़ंक्शन नहीं और कोई सी ++ 0x नहीं है।

उत्तर

12

डिज़ाइन के मामले में, bind का उपयोग करने वाला कोई व्यक्ति निश्चित रूप से स्पष्ट है। (स्पष्ट फ़ंक्शन ऑब्जेक्ट के बाद)। क्यूं कर? संक्षिप्त।

प्रदर्शन के संदर्भ में, फ़ंक्शन ऑब्जेक्ट को अजेय होना चाहिए (सब कुछ आसानी से विश्लेषण और रेखांकित किया जा सकता है)। संकलक ऑप्टिमाइज़ करने के तरीके के आधार पर, bind का उपयोग करने वाला कोई भी संभवतः इसे मिलान कर सकता है (संकलक के विश्लेषण के आधार पर is_old_result पर कॉलर पॉइंटर के माध्यम से हो सकता है या नहीं)।

results.remove_if(ResultOlderThan(lifetime)); 

:

+0

मैं पूरी तरह से सहमत हूं। – ltjax

+0

मैं भी सहमत हूं, बाइंड सिंटैक्स पढ़ने के लिए सबसे आसान है। यदि प्रदर्शन एक माध्यमिक चिंता है तो यहां बांधें। –

+3

मैं भी सहमत हूं, और मैं जोड़ूंगा कि प्रदर्शन तब तक एक माध्यमिक चिंता होनी चाहिए जब तक आप प्रोफाइल नहीं करते और निर्धारित करते हैं कि यह कथन एक प्रदर्शन बाधा है। –

3
इस तरह के "IsOldResult" या "ResultOlderThan", मैं कहूँगा कि अंतिम समाधान सबसे पढ़े जा सकेंगे, के रूप में यह एक है कि सबसे गद्य के लिए गुजरता है के रूप में अधिक उपयुक्त नामकरण के साथ

, हालांकि, अगर मैं एल्गोरिदम का प्रतिनिधित्व करता हूं तो मैं केवल कई संदर्भों में बदलता हूं तो मैं केवल मज़ेदार और लिखूंगा। एक सिंगल लाइनर कॉल साइट से भौतिक रूप से हटाए गए 5-लाइन वर्ग को लिखना मेरे लिए बेहद अपर्याप्त लगता है।

अन्यथा, बूस्ट :: बाइंड विकल्प में मेरा वोट है क्योंकि इसमें इसके बीच कम से कम अतिरिक्त फ्लाफ है और std :: bind2nd (_1 और std :: mem_fun_ref, क्रमशः) है। इसके अलावा, बूस्ट :: बाइंड सामान्य रूप से अधिक मामलों के लिए काम करता है, जैसे कि एक ऐसे मामले जहां आप केवल एक पैरामीटर के एक चर को बाध्य नहीं कर रहे हैं जिसमें केवल दो पैरामीटर हैं।

+0

उपयुक्त 'परिणाम ओल्डरहान' के बारे में अच्छी बात –

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