मैं इस एक छोटा सा पुराना पता ..
लेकिन मैं जोड़ना चाहते थे:
लैम्ब्डा अभिव्यक्ति (यहां तक कि कब्जा वाले) एक समारोह सूचक के रूप में संभाला जा सकता है!
यह मुश्किल है क्योंकि एक लैम्ब्डा अभिव्यक्ति एक साधारण कार्य नहीं है। यह वास्तव में एक ऑपरेटर() के साथ एक वस्तु है।
जब आप रचनात्मक होते हैं, तो आप इसका उपयोग कर सकते हैं! std :: function की शैली में "फ़ंक्शन" कक्षा के बारे में सोचें। यदि आप ऑब्जेक्ट को सहेजते हैं!
आप फ़ंक्शन पॉइंटर का भी उपयोग कर सकते हैं।
समारोह सूचक का उपयोग करने के लिए, आप निम्नलिखित का उपयोग कर सकते हैं:
int first = 5;
auto lambda = [=](int x, int z) {
return x + z + first;
};
int(decltype(lambda)::*ptr)(int, int)const = &decltype(lambda)::operator();
std::cout << "test = " << (lambda.*ptr)(2, 3) << std::endl;
एक वर्ग है कि एक समान कार्य करना प्रारंभ कर सकते हैं का निर्माण करने के लिए "std :: समारोह" मैं सिर्फ कम उदाहरण करेंगे।() निष्पादित सबसे पहले आप कर सकते हैं की दुकान वस्तु और समारोह सूचक की तुलना में एक वर्ग/struct की जरूरत भी आप एक ऑपरेटर की जरूरत:
// OT => Object Type
// RT => Return Type
// A ... => Arguments
template<typename OT, typename RT, typename ... A>
struct lambda_expression {
OT _object;
RT(OT::*_function)(A...)const;
lambda_expression(const OT & object)
: _object(object), _function(&decltype(_object)::operator()) {}
RT operator() (A ... args) const {
return (_object.*_function)(args...);
}
};
इस के साथ अब आप पर कब्जा कर लिया चला सकते हैं, noncaptured lambdas, जैसा कि आप मूल का उपयोग कर रहे :
auto capture_lambda() {
int first = 5;
auto lambda = [=](int x, int z) {
return x + z + first;
};
return lambda_expression<decltype(lambda), int, int, int>(lambda);
}
auto noncapture_lambda() {
auto lambda = [](int x, int z) {
return x + z;
};
return lambda_expression<decltype(lambda), int, int, int>(lambda);
}
void refcapture_lambda() {
int test;
auto lambda = [&](int x, int z) {
test = x + z;
};
lambda_expression<decltype(lambda), void, int, int>f(lambda);
f(2, 3);
std::cout << "test value = " << test << std::endl;
}
int main(int argc, char **argv) {
auto f_capture = capture_lambda();
auto f_noncapture = noncapture_lambda();
std::cout << "main test = " << f_capture(2, 3) << std::endl;
std::cout << "main test = " << f_noncapture(2, 3) << std::endl;
refcapture_lambda();
system("PAUSE");
return 0;
}
इस कोड VS2015 साथ काम करता है आशा है कि यह मदद करता है:)
स्वागत करती है!
संपादित करें: हटा सुइयों टेम्पलेट एफपी, हटाया समारोह सूचक पैरामीटर, lambda_expression को
अद्यतन 04.07.17 का नाम बदला:
template <typename CT, typename ... A> struct function
: public function<decltype(&CT::operator())(A...)> {};
template <typename C> struct function<C> {
private:
C mObject;
public:
function(const C & obj)
: mObject(obj) {}
template<typename... Args> typename
std::result_of<C(Args...)>::type operator()(Args... a) {
return this->mObject.operator()(a...);
}
template<typename... Args> typename
std::result_of<const C(Args...)>::type operator()(Args... a) const {
return this->mObject.operator()(a...);
}
};
namespace make {
template<typename C> auto function(const C & obj) {
return ::function<C>(obj);
}
}
int main(int argc, char ** argv) {
auto func = make::function([](int y, int x) { return x*y; });
std::cout << func(2, 4) << std::endl;
system("PAUSE");
return 0;
}
लैम्ब्डा केवल पॉइंटर को कार्य करने का क्षय कर सकता है अगर वे कुछ भी कैप्चर नहीं करते हैं। – Jarod42
http://blogs.msdn.com/b/oldnewthing/archive/2015/02/20/10594680.aspx – BoBTFish