2009-06-15 25 views
15

उदाहरण का पालन करें।बूस्ट :: बाइंड और क्लास सदस्य फ़ंक्शन

#include <iostream> 
#include <algorithm> 
#include <vector> 

#include <boost/bind.hpp> 

void 
func(int e, int x) { 
    std::cerr << "x is " << x << std::endl; 
    std::cerr << "e is " << e << std::endl; 
} 

struct foo { 
    std::vector<int> v; 

    void calc(int x) { 
     std::for_each(v.begin(), v.end(), 
      boost::bind(func, _1, x)); 
    } 

    void func2(int e, int x) { 
     std::cerr << "x is " << x << std::endl; 
     std::cerr << "e is " << e << std::endl; 
    } 

}; 

int 
main() 
{ 
    foo f; 

    f.v.push_back(1); 
    f.v.push_back(2); 
    f.v.push_back(3); 
    f.v.push_back(4); 

    f.calc(1); 

    return 0; 
} 

सभी ठीक है अगर मैं func() फ़ंक्शन का उपयोग करें काम करता है। लेकिन वास्तविक जीवन आवेदन में मुझे कक्षा सदस्य समारोह का उपयोग करना है, यानी foo::func2() इस उदाहरण में। मैं इसे बढ़ावा देने के साथ कैसे कर सकता हूं :: बाइंड?

उत्तर

18

आप सच में, सच करीब थे:

void calc(int x) { 
    std::for_each(v.begin(), v.end(), 
     boost::bind(&foo::func2, this, _1, x)); 
} 

संपादित करें: उफ़, इसलिए मैं हे था।

हालांकि, प्रतिबिंब पर, आपके पहले कामकाजी उदाहरण में वास्तव में कुछ भी गलत नहीं है। जहां संभव हो, आपको सदस्य कार्यों पर वास्तव में नि: शुल्क कार्यों का पक्ष लेना चाहिए - आप अपने संस्करण में बढ़ी सादगी देख सकते हैं।

+0

इस बढ़ावा :: लांबा :: बाँध के साथ काम करने आते है। मैंने बूस्ट :: बाइंड का उपयोग नहीं किया। –

1

वर्ग के सदस्य कार्यों बंधन के लिए बढ़ावा :: बाँध का उपयोग करते समय, दूसरा तर्क वस्तु संदर्भ प्रदान करना होगा। तो अपने कोड काम करेंगे जब दूसरा तर्क this

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