ল্যাম্বডা এক্সপ্রেশন এমনকি ক্যাপচার হওয়াগুলিও একটি ফাংশন পয়েন্টার (সদস্য ফাংশনটির পয়েন্টার) হিসাবে পরিচালনা করা যায়।
এটি মুশকিল কারণ একটি ল্যাম্বডা এক্সপ্রেশন কোনও সাধারণ ফাংশন নয়। এটি আসলে অপারেটর () সহ একটি বস্তু।
আপনি যখন সৃজনশীল হন, আপনি এটি ব্যবহার করতে পারেন! স্ট্যান্ড :: ফাংশনের স্টাইলে একটি "ফাংশন" শ্রেণীর কথা ভাবেন। আপনি যদি বস্তুটি সংরক্ষণ করেন তবে আপনি ফাংশন পয়েন্টারটিও ব্যবহার করতে পারেন।
ফাংশন পয়েন্টার ব্যবহার করতে, আপনি নিম্নলিখিতটি ব্যবহার করতে পারেন:
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 :: ফাংশন" এর মতো কাজ করা শুরু করতে পারে এমন একটি শ্রেণি তৈরি করতে প্রথমে আপনার অবজেক্ট এবং ফাংশন পয়েন্টার সঞ্চয় করার চেয়ে ক্লাস / কাঠামো প্রয়োজন। এছাড়াও এটি কার্যকর করতে আপনার অপারেটর প্রয়োজন:
// 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...);
}
};
এটির সাহায্যে আপনি এখন যেমন ক্যাপচারড, নন-ক্যাপচারড ল্যাম্বডাস চালাতে পারেন আপনি যেমন আসলটি ব্যবহার করছেন:
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;
}
এই কোডটি ভিএস ২০১৫ এর সাথে কাজ করে
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;
}