में std :: वादा कैप्चर करें मैं एक राज्य मशीन बनाना चाहता हूं जो सबमिट किए गए संकेतों को अपने स्वयं के धागे में संसाधित करता है। मैं विजुअल स्टूडियो 2015 का उपयोग करता हूं, इसलिए सी ++ 11 और आंशिक रूप से सी ++ 14 समर्थित है। सिग्नल कंटेनर में संग्रहीत हैं। प्रत्येक सिग्नल को std :: फ़ंक्शन के रूप में दर्शाया जाता है। मैं क्लाइंट से तब तक इंतजार करना चाहता हूं जब तक राज्य मशीन सबमिट किए गए सिग्नल को संसाधित न करे, इसलिए यह एक प्रकार का सिंक्रोनस सिग्नल है।एक lambda सी ++ 14
मेरी समस्या यह है कि: मैं एक ldda में std :: वादा नहीं कर सकता और इसे कंटेनर में जोड़ सकता हूं।
#include <functional>
#include <future>
#include <list>
std::list<std::function<int()>> callbacks;
void addToCallbacks(std::function<int()>&& callback)
{
callbacks.push_back(std::move(callback));
}
int main()
{
std::promise<int> prom;
auto fut = prom.get_future();
// I have made the lambda mutable, so that the promise is not const, so that I can call the set_value
auto callback = [proms{ std::move(prom) }]() mutable { proms.set_value(5); return 5; };
// This does not compile
addToCallbacks(std::move(callback));
// This does not compile either, however this lambda is a temporal value (lvalue)
addToCallbacks([proms{ std::move(prom) }]() mutable { proms.set_value(5); return 5; });
return 0;
}
क्या समाधान मैं संदर्भ
- हैं मैं वादा
करने के लिए एक * सूचक या एक shared_ptr पर कब्जा करने से बचना चाहते हैं लैम्बडा उत्पन्न करता है किसी भी तरह कक्षा में वादा को एम्बेड करना अच्छा लगेगा। इसका मतलब है कि लैम्ब्डा अब और अधिक गतिशील नहीं है। क्या यह सभी के लिए संभव है?
डिजाइन समीक्षा: 'std :: list' का उपयोग नहीं जब तक आप सच में, सच इटरेटर स्थिरता की आवश्यकता होती है। आपका लक्ष्य "रिटर्न वैल्यू" भविष्य में दिखाना है (जिसे कहीं भी डीकॉप्लेड किया गया है), और उस फ़ंक्शन के रिटर्न वैल्यू में जिसे आप कॉल करते हैं? – Yakk