हाल ही में, मुझे लैम्ब्डा अभिव्यक्ति के पैरामीटर के रूप में पारित फ़ंक्शन को पास करने के साथ एक अजीब समस्या का सामना करना पड़ा। यह कोड क्लैंग 3.5+ के साथ ठीक है, लेकिन जी ++ 5.3 के साथ असफल रहा है और मुझे आश्चर्य है कि समस्या सी ++ मानक में है, क्लैंग में एक गैर मानक विस्तार, या जीसीसी में एक अवैध वाक्य रचनात्मक व्याख्या।सी ++ 11 लैम्ब्डा पैरामीटर के रूप में पासिंग फ़ंक्शन
error: variable ‘fn’ has function type
{ promise->set_value(fn(std::move(args)...)); };
(...)
error: field ‘async(Fn&&, Args&& ...) [with Fn = int (&)(int, int); Args = {int&, int&}; T = int]::<lambda()>::<fn capture>’ invalidly declared function type
auto lambda = [promise, fn, args...](void)
सौभाग्य से, मैं एक साधारण वैकल्पिक हल मिल गया है, एक std :: समारोह वस्तु जोड़ने, समारोह पैरामीटर encapsulating:
template<typename Fn, typename... Args, typename T = typename std::result_of<Fn(Args...)>::type>
std::future<T>
async(Fn &&fn, Args &&... args)
{
std::shared_ptr<std::promise<T>> promise = std::make_shared<std::promise<T>>();
auto lambda = [promise, fn, args...](void)
{ promise->set_value(fn(std::move(args)...)); };
send_message(std::make_shared<post_call>(lambda));
return promise->get_future();
};
जीसीसी निम्नलिखित सूचना:
उदाहरण कोडपरी सरल है :
template<typename Fn, typename... Args, typename T = typename std::result_of<Fn(Args...)>::type>
std::future<T>
async(Fn &&fn, Args &&... args)
{
std::shared_ptr<std::promise<T>> promise = std::make_shared<std::promise<T>>();
std::function<T(typename std::remove_reference<Args>::type...)> floc = fn;
auto lambda = [promise, floc, args...](void)
{ promise->set_value(floc(std::move(args)...)); };
send_message(std::make_shared<post_call>(lambda));
return promise->get_future();
};
हालांकि मैं पूरी तरह से समझ नहीं पा रहा हूं कि एफआईआर में क्या गलत था टी कोड का टुकड़ा, जो सफलतापूर्वक clang के साथ संकलित और त्रुटियों के बिना चलाने के लिए।
संपादित
मैं सिर्फ देखा है, कि मेरे समाधान भयंकर रूप में विफल रहता है, यदि तर्क में से एक के लिए एक संदर्भ होना चाहिए था। तो यदि आपके पास कोई अन्य सुझाव है जो सी ++ 11 के साथ काम कर सकता है (यानी विशेष लैम्ब्डा कैप्चर [सी ++ 14 फीचर] के बिना), यह वास्तव में अच्छा होगा ...
अगर आप 'पारित ऑटो p_fn क्या होता है = और lambda के लिए fn'? –
@ जोएल कॉर्नेट सिगसेग या कुछ इसी तरह। एक संदर्भ के रूप में 'fn' गुजरने के साथ वही चीज़ खुश है। हालांकि यह दोनों मामलों में संकलित करता है। – Marandil