यह सवाल एक और अधिक सार रास्ते में How to deduce the type of the functor's return value? की एक अनुवर्ती मैं इसे पुन: तैयार कर रहा हूँ है।एक मजेदार के रिटर्न प्रकार को कम करने के लिए सामान्य तरीका?
एक टेम्पलेट समारोह
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(<decl-expr>)
{
// do something
// ............
return fn(<ret-expr>)
}
जहां <ret-expr>
एक मनमाना अभिव्यक्ति जो arg
शामिल है, मैं <decl-expr>
के लिए करते हैं जाएगा ComputeSomething
की वापसी प्रकार functor की वापसी प्रकार के बराबर सेट करने के लिए की स्यूडोकोड को देखते हुए।
functor एक वर्ग, एक लैम्ब्डा या एक समारोह सूचक हो सकता है।
आंशिक समाधान मैं अब तक नहीं मिला।
(क) अपने सभी जुड़े हुए ecatmur द्वारा किया जाता प्रश्न के लिए जवाब। अनिवार्य रूप से, यह <decl-expr>
में रिटर्न स्टेटमेंट दोहरा रहा है। समस्याएं: यह त्रुटि-प्रवण है और स्थानीय चर शामिल होने पर काम नहीं करेगा।
(b) यह समारोह संकेत के लिए ही काम करता है
template <typename Arg, typename Ret>
Ret ComputeSomething(Arg arg, Ret(*fn)(Arg))
(ग) यह मानता है कि functor के तर्क (सामान्य रूप में पकड़ नहीं सकता है) प्रकार Arg
की है और Arg
की आवश्यकता है default- होने के लिए constructible
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(Arg())
(घ) std::declval
का प्रयोग के रूप में how to deduce the return type of a function in template में सुझाव दिया है, जो डिफ़ॉल्ट-constructible प्रतिबंध लिफ्ट करने के लिए माना जाता है। क्या कोई यह समझा सकता है कि यह कैसे काम करता है?
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(std::declval<Arg>())
मैं यह कहना माफी चाहता हूँ, लेकिन AFAIK यह संभव नहीं है, क्योंकि अनुगामी वापसी नहीं देखता समारोह टेम्पलेट परिभाषित किया जा रहा है, जबकि शरीर करता है –