2013-03-21 26 views
5

एक साधारण उदाहरण बताता है कि std::bind का उपयोग कैसे किया जा सकता है:कैसे std :: बाइंड का उपयोग किया जा सकता है?

मान लें कि हमारे पास 3 तर्कों का कार्य है: f3 (x, y, z)। हम 2 तर्कों का एक कार्य करना चाहते हैं जिन्हें परिभाषित किया गया है: f2(x,y) = f3(x,5,y)। C++ में हम इसे std::bind के साथ आसानी से कर सकते हैं:

auto f2 = std::bind(f3, _1, 5, _2); 

यह उदाहरण मेरे लिए स्पष्ट है: std::bind अपनी पहली तर्क के रूप में एक समारोह लेता है और फिर इसे लेता है n अन्य तर्कों, जहां n समारोह के तर्क की संख्या है जिसे std::bind के लिए पहला तर्क माना जाता है।

void foo(int &x) 
{ 
    ++x; 
} 


int main() 
{ 
    int i = 0; 

    // Binds a copy of i 
    std::bind(foo, i)(); // <------ This is the line that I do not understand. 
    std::cout << i << std::endl; 

} 

यह स्पष्ट है foo एक तर्क है कि और std::bind साथ यह i करने के लिए सेट किया गया था:

हालांकि, मैं बाँध का एक और उपयोग मिल गया। लेकिन हम (foo, i) के बाद ब्रैकेट की एक और जोड़ी का उपयोग क्यों करते हैं? और हम std::bind के आउटपुट का उपयोग क्यों नहीं करते? मेरा मतलब है, हमारे पास auto f = std::bind(foo, i) क्यों नहीं है?

auto bar = std::bind(foo, i); 
bar(); 

यह एक बाध्य functor बनाता है, तो तुरंत यह (कोष्ठक की दूसरी जोड़ी का उपयोग करके) कहता है:

+2

पृथ्वी पर क्या है \\\ '? –

+0

यह एक टिप्पणी होना चाहिए था: // – Roman

उत्तर

8

लाइन

std::bind(foo, i)(); 

के बराबर है।

संपादित करें: सटीकता के नाम पर (और @Roman, @daramarak द्वारा इंगित) दोनों वास्तव में सीधे फ़ंक्शन को कॉल करने के बराबर नहीं हैं: मुझे मूल्य से std :: bind से पास किया जाता है। foo सीधे कॉल मैं के साथ करने के लिए कोड बराबर, होगा:

auto bar = std::bind(foo, std::ref(i)); 
bar(); 
+0

एक अवैध आपत्ति के बारे में मेरी टिप्पणियां हटा दी गईं – daramarak

2

आपका दो सवाल काफी एक दूसरे को जवाब। पिछला () सिर्फ एक सामान्य फ़ंक्शन कॉल है। इसलिए, अभिव्यक्ति का अर्थ है: "i से foo बांधें; इससे कोई फ़ंक्शन नहीं लेता है, फिर परिणामस्वरूप फ़ंक्शन को कॉल करें।" चूंकि कोड के लेखक ने निर्णय लिया कि कॉल करने के बाद फ़ंक्शन की आवश्यकता नहीं है, यह कहीं भी संग्रहीत नहीं है।

3

यह एक अस्थायी वस्तु को foo बांधता है और फिर इसे तुरंत फोन:

auto f = std::bind(foo, i); 
    f(); 

सिंगल लाइन संस्करण:

std::bind(foo, i)(); 
0

लाइन

std::bind(foo, i)() ; 

के बाद से ... करता है एक ही चीज़ ...

foo(i); 

... यह वास्तव में std :: बाइंड का 'उपयोग' नहीं है जिसे आप वास्तविक कोड में प्राप्त कर सकते हैं, लेकिन यह एक सरल उदाहरण के रूप में कार्य करता है जो std :: bind करता है, जैसा कि अन्य में बताया गया है जवाब।

जैसा कि आप इंगित करते हैं, बाइंड के परिणाम को स्टोर करने और इसे कहीं और कॉल करने का सामान्य मामला है, अन्यथा पहले स्थान पर std :: bind के साथ कोड को जटिल बनाने में कोई बात नहीं है।

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