উত্তর:
পৃথক ল্যাম্বডাস সংকলক দ্বারা বিভিন্ন শ্রেণিতে অনুবাদ করা হয়। উদাহরণস্বরূপ, ল্যাম্বদা 1 এর সংজ্ঞাটি সমান:
class SomeCompilerGeneratedTypeName {
public:
SomeCompilerGeneratedTypeName(...) { // Capture all the required variables here
}
void operator()(T& arg) const {
// ...
}
private:
// All the captured variables here ...
};
অতএব, দুটি পৃথক প্রকার সংকলক দ্বারা উত্পাদিত হয়, যা এর জন্য একটি ধরণের বেমানান হয় causes auto lambda = condition ? lambda1 : lambda2;
নিম্নলিখিত কাজ করবে:
auto lambda = condition ? std::function<void(T&)>(lambda1) : std::function<void(T&)>(lambda2);
উভয় ল্যাম্বডাস প্রকৃতপক্ষে বিভিন্ন ধরণের হাইলাইট করার জন্য, আমরা <typeinfo>
স্ট্যান্ডার্ড লাইব্রেরি এবং typeid
অপারেটর থেকে ব্যবহার করতে পারি । ল্যাম্বডাস বহুবিধ প্রকারের নয়, সুতরাং মানটি গ্যারান্টি দেয় যে সংকলনের সময় 'টাইপড' অপারেটরটি মূল্যায়ন করা হয়। এটি দেখায় যে আরটিটিআই অক্ষম থাকলেও নিম্নলিখিত উদাহরণটি বৈধ:
#include <iostream>
#include <typeinfo>
int main()
{
struct T {
};
auto lambda1 = [&](T& arg) {
return;
};
auto lambda2 = [&](T& arg) {
return;
};
std::cout << typeid(lambda1).name() << "/" << typeid(lambda1).hash_code() << std::endl;
std::cout << typeid(lambda2).name() << "/" << typeid(lambda2).hash_code() << std::endl;
return 0;
}
প্রোগ্রামটির আউটপুটটি হ'ল (জিসিসি 8.3 সহ, গবোল্টে দেখুন ):
Z4mainEUlRZ4mainE1TE_/7654536205164302515
Z4mainEUlRZ4mainE1TE0_/10614161759544824066
SomeCompilerGeneratedTypeName1
এবংSomeCompilerGeneratedTypeName2
কৌতূহলজনকভাবে, যদি ল্যাম্বডাস ক্যাপচার-কম হয় তবে অপারেটর +
ট্রিক নিয়োগ দেওয়া যেতে পারে:
auto lambda1 = [](int arg) { ... };
auto lambda2 = [](int arg) { ... };
auto lambda = condition ? +lambda1 : +lambda2; // This compiles!
lambda(2019);
এটি কাজ করে, কারণ +
ল্যাম্বডাকে একটি ফাংশন পয়েন্টারে রূপান্তরিত করবে এবং উভয় ফাংশন পয়েন্টারে একই ধরণের (মত কিছু void (*)(int)
) রয়েছে।
জিসিসি এবং কলংয়ের সাথে (তবে এমএসভিসির সাথে নয়) +
বাদ দেওয়া যেতে পারে, ল্যাম্বডাস এখনও ফাংশন পয়েন্টারে রূপান্তরিত হবে।
এটি সংকলন করে না কারণ প্রতিটি ল্যাম্বডায় একটি অনন্য প্রকার রয়েছে, এর জন্য কোনও সাধারণ ধরণের নেই ?:
।
আপনি এগুলিকে গুটিয়ে রাখতে পারেন std::function<void(T&)>
, যেমন
auto lamba1 = [&](T& arg) {
...
};
auto lambda2 = [&](T& arg) {
...
};
auto lambda = condition ? std::function(lambda1) : lambda2; // C++17 class template deduction