2011-09-12 11 views
5

यहाँ कैसे मेरी कक्षा के रूप में परिभाषित किया गया है की एक सामान्य विचार है के साथ सदस्य समारोह पर for_each उपयोगstd :: दो आर्ग

struct Funktor 
{ 
    Funktor(int val):m_val(val){} 
    bool operator()(int arg1, int arg2) { return m_val==arg1*arg2; } 
    int m_val; 
}; 

(यह क्या नीचे उल्लेख किया गया है के अलावा अन्य संचालन करता है) और अब मैं का एक वेक्टर है उपर्युक्त वस्तुएं, और मैं for_each का उपयोग कर ऑपरेटर() को कॉल करने का प्रयास कर रहा हूं, क्या ऐसा करने का कोई तरीका है? मुझे पता है कि यह bind2nd और mem_func_ref का उपयोग करके किया जा सकता है लेकिन जब केवल एक तर्क होता है लेकिन दो तर्कों के लिए मुझे कोई रास्ता नहीं मिला है।

int main() 
{ 
    std::vector<Funktor> funktors; 
    funktors.push_back(Funktor(10)); 
    funktors.push_back(Funktor(20)); 
    funktors.push_back(Funktor(30)); 

    int arg1 = 5, arg2 = 6; 
    //instead of the for loop below I want to use for_each 
    for(std::vector<Funktor>::iterator itr = funktors.begin(); funktors.end() != itr; ++itr) 
    { 
     (*itr)(arg1,arg2); 
    } 
} 

किसी भी मदद के लिए धन्यवाद। श्रेष्ठ।

सीवी

+1

क्या आप स्पष्ट कर सकते हैं कि आप ऐसा क्यों करना चाहते हैं? यह प्रभावी रूप से नो-ऑप की तरह दिखता है। –

+0

@ मार्क: क्या आपका मतलब ऑपरेटर() कुछ भी नहीं करता है? यह सिर्फ मेरी कक्षा की संरचना का विचार देना था। – blueskin

+0

@blueskin: उसका मतलब है कि 'std :: for_each' डिस्कार्ड इसके परिणामस्वरूप मक्खियों से निकलता है, इसलिए' बूल की वापसी का कभी भी उपयोग नहीं किया जाएगा, इस विशेष नमूना को व्यर्थ बना दिया जाएगा। – ildjarn

उत्तर

7

सी ++ 03 समाधान (बढ़ावा के बिना):

एक और functor लिखें के रूप में:

std::for_each(funktors.begin(),funktors.end(), TwoArgFunctor(arg1,arg2)); 

:

struct TwoArgFunctor 
{ 
    int arg1, arg2; 
    TwoArgFunctor(int a, int b) :arg1(a), arg2(b) {} 

    template<typename Functor> 
    bool operator()(Functor fun) 
    { 
     return fun(arg1, arg2); //here you invoke the actual functor! 
    } 
}; 

तब के रूप में उपयोग सी ++ 11 समाधान:

std::for_each(funktors.begin(),funktors.end(), 
         [&] (Funktor f) -> bool { return f(arg1,arg2); }); 
+0

सी ++ 03 समाधान काम करेगा। धन्यवाद। इसके अलावा, '[&] (Funktor f) -> बूल' वाक्यविन्यास मजाकिया लग रहा है, क्या मैं पूछ सकता हूं कि इसका क्या अर्थ है? – blueskin

+0

@blueskin: आप यहां उस हास्यास्पद वाक्यविन्यास के बारे में परिचित हो सकते हैं: http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions – Nawaz

+1

लिंक के लिए धन्यवाद नवाज – blueskin

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