2012-04-08 16 views
11

मेरे पास यह कोड है और मुझे नहीं पता कि मैं क्या हासिल करना चाहता हूं, संभव है।मैं अपने भीतर लैम्ब्डा फ़ंक्शन का उपयोग कैसे कर सकता हूं?

_acceptor.async_accept(
    _connections.back()->socket(), 
    [this](const boost::system::error_code& ec) 
    { 
     _connections.push_back(std::make_shared<TcpConnection>(_acceptor.get_io_service())); 
     _acceptor.async_accept(_connections.back()->socket(), this_lambda_function); 
    } 
); 

एक बार सॉकेट स्वीकार करने के बाद, मैं हैंडलर (उर्फ लैम्ब्डा फ़ंक्शन) का पुन: उपयोग करना चाहता हूं। क्या यह संभव है? क्या इसे पूरा करने का कोई बेहतर तरीका है?

+0

+1 बहुत ही रोचक सवाल। मैंने पहले इसके बारे में सोचा नहीं था। – templatetypedef

+1

https://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/f1b3569c8aac0660?pli=1 – Anonymous

+0

आपके प्रश्न से संबंधित नहीं है, लेकिन आपको पता होना चाहिए कि अग्रणी अंडरस्कोर (और दो आसन्न अंडरस्कोर) आरक्षित हैं और आवेदन पहचानकर्ताओं के लिए इस्तेमाल नहीं किया जाना चाहिए। – Marc

उत्तर

9

आप अपने आप में लैम्ब्डा की एक प्रति स्टोर करने के लिए, std::function<> (या कुछ इसी तरह) के लिए एक मध्यस्थ के रूप में प्रयोग किया है:

std::function<void(const boost::system::error_code&)> func; 
func = [&func, this](const boost::system::error_code& ec) 
{ 
    _connections.push_back(std::make_shared<TcpConnection>(_acceptor.get_io_service())); 
    _acceptor.async_accept(_connections.back()->socket(), func); 
} 

_acceptor.async_accept(_connections.back()->socket(), func); 

लेकिन आप इसे संदर्भ से केवल कर सकते हैं; यदि आप इसे मूल्य से कैप्चर करने का प्रयास करते हैं, तो यह काम नहीं करेगा। इसका मतलब है कि आपको कैंप-बाय-रेफरेंस का उपयोग करने के लिए उपयोग करने के लिए इस तरह के लैम्ब्डा के उपयोग को सीमित करना होगा। तो यदि आप अपने एसिंक फ़ंक्शन समाप्त होने से पहले इस दायरे को छोड़ देते हैं, तो यह टूट जाएगा।

आपका दूसरा विकल्प लैम्ब्डा के बजाय उचित मज़ेदार बनाना है। आखिरकार, भेड़ का बच्चा सबकुछ नहीं कर सकता।

+0

क्या हम 'ऑटो' का उपयोग नहीं कर सकते? – balki

+0

@balki: नहीं। यह परिवर्तनीय नाम का उपयोग करने वाली अभिव्यक्ति के साथ चर को प्रारंभ करने के लिए सी/सी ++ में कानूनी है। हालांकि, 'ऑटो' चर से निपटने पर यह बंद हो जाता है क्योंकि परिवर्तनीय नाम में एक प्रकार नहीं होता है जब तक कि अभिव्यक्ति के प्रकार को निर्धारित नहीं किया जा सके। –

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

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