2015-12-17 35 views
8

के लिए ptr_fun निम्नलिखित पर विचार करें:का उपयोग std :: एक सदस्य समारोह

class A 
{ 
    public: 
    bool is_odd(int i) 
    { 
     return (i % 2) != 0; 
    } 

    void fun() 
    { 
     std::vector<int> v2; 
     v2.push_back(4); 
     v2.push_back(5); 
     v2.push_back(6); 

     // fails here 
     v2.erase(std::remove_if(v2.begin(), v2.end(), std::not1(std::ptr_fun(is_odd))), v2.end()); 
    } 
}; 

ऊपर कोड is_odd() के प्रभाव नकारना है क्योंकि यह एक सदस्य समारोह है विफल रहता है। std::ptr_fun() पर कॉल विफल रहता है।

मैं इसे कैसे काम करने के लिए बना सकता हूं? कृपया ध्यान दें कि मैं एक गैर स्थैतिक सदस्य समारोह होने के लिए is_odd() चाहता हूं।

+3

'is_odd' एक स्थिर कार्य करें? या एक गैर-सदस्य समारोह? सदस्य समारोह होने का कोई कारण नहीं है। –

+0

@HappyCoder: इसे तब एक स्थिर सदस्य फ़ंक्शन बनाएं। –

+0

आप एक मज़ेदार वर्ग लिख सकते हैं जो * [इस] (int n) के प्रकार {return is_odd (n);} 'स्वयं' है और इसका उपयोग करें। –

उत्तर

8

एक एकल विधेय के रूप में A::is_odd(int) का उपयोग कर, विशेष रूप से जब यह std::not1() साथ प्रयोग किया जा करने की जरूरत है के साथ कई मुद्दों पर होते हैं:

  1. A::is_odd(int) को एक कॉल दो तर्क लेता है: अंतर्निहित वस्तु ("this") और दृश्य int तर्क।
  2. यह argument_type और result_type को परिभाषित करने वाला फ़ंक्शन ऑब्जेक्ट नहीं है। एक उपयुक्त समारोह वस्तु, जैसे, std::mem_*fun कार्यों में से एक का उपयोग करने के

    1. सदस्य समारोह सूचक अनुकूल:

    ठीक तरह से एक एकल विधेय के रूप में इस सदस्य समारोह का उपयोग कर दो चरणों की आवश्यकता।

  3. गैर-सी ++ 11 कंपाइलर के साथ संभवतः std::bind1st() का उपयोग कर उपयुक्त ऑब्जेक्ट पर पहला तर्क बाध्यकारी।

सी ++ 11 कंपाइलर चीजों के साथ बहुत आसान है क्योंकि std::bind() इनमें से दोनों का ख्याल रखना है। मान लिया जाये कि यह A के एक सदस्य से प्रयोग किया जाता है:

... std::not1(std::bind(&A::is_odd, this, std::placeholders::_1)) ... 

ही एक पूर्व सी ++ 11 संकलक के साथ कुछ हद तक कठिन है। std::remove_if() में उपयोग इस तरह कुछ दिखाई देगा:

v2.erase(
    std::remove_if(v2.begin(), 
        v2.end(), 
        std::not1(std::bind1st(std::mem_fun(&A::is_odd), this))), 
    v2.end()); 
+0

'std :: mem_fun' का अच्छा उपयोग :-) –

+0

@KerrekSB: हाँ। मैंने यह नहीं देखा कि इसे 'ए' के ​​सदस्य से बुलाया जाता है। मैंने जवाब अपडेट किया। धन्यवाद। –

0

बस is_odd स्थिर बनाने के लिए, तो यह एक अंतर्निहित this पैरामीटर की जरूरत नहीं होगी:

static bool is_odd(int i) 

यह वैसे भी किसी भी सदस्य चर या अन्य सदस्य कार्यों का उपयोग नहीं करता है।

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