সি ++ 20 এ ইতিমধ্যে জেনেরিক ল্যাম্বডা উপস্থিত থাকলে টেমপ্লেট লাম্বদাটির প্রয়োজনীয়তা কী?


99

জেনেরিক ল্যাম্বডাস প্রবর্তিত যার ফলে নিম্নলিখিতটি লেখা সম্ভব হয়েছিল:

auto func = [](auto a, auto b){
    return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");

এটি খুব স্পষ্ট যে এই জেনেরিক ল্যাম্বদা funcঠিক তেমন কোনও টেম্প্লেটেড ফাংশন যেমন কাজ funcকরবে তেমন কাজ করে।

সি ++ কমিটি জেনেরিক ল্যামডার জন্য টেম্পলেট সিনট্যাক্স যুক্ত করার সিদ্ধান্ত নিয়েছে কেন?


4
আপনি যদি আর্গুমেন্ট বা রিটার্ন টাইপের চেয়ে আলাদা টেম্পলেট টাইপ ব্যবহার করতে চান? এবং শরীরের ভিতরে এটি প্রয়োজন হলে কী হবে?
কিছু প্রোগ্রামার

আমাকে বলা হয়েছে এই একটি আকর্ষণীয় ব্যবহার কেস।
ম্যাক্স ল্যাঙ্গোফ

বিভিন্ন ল্যামডা সংস্করণ একটি তুলনামূলক এই দেখুন: modernescpp.com/index.php/more-powerful-lambdas-with-c-20
schoetbi

উত্তর:


115

সি ++ 14 জেনেরিক ল্যাম্বডাস দেখতে খুব সুন্দর একটি ফ্যান্টর তৈরির জন্য খুব দুর্দান্ত উপায় operator ():

template <class T, class U>
auto operator()(T t, U u) const;

তবে এটির মতো নয়:

template <class T>
auto operator()(T t1, T t2) const; // Same type please

না এর মতো:

template <class T, std::size_t N>
auto operator()(std::array<T, N> const &) const; // Only `std::array` please

না এটির মতো (যদিও এটি ব্যবহার করতে কিছুটা জটিল হয়ে ওঠে):

template <class T>
auto operator()() const; // No deduction

সি ++ ১৪ টি ল্যাম্বডাস ভাল, তবে সি ++ 20 আমাদের ঝামেলা ছাড়াই এই কেসগুলি বাস্তবায়নের অনুমতি দেয়।


4
সুন্দর এবং সংক্ষিপ্ত। কেবল এটি যোগ করুন: প্রথম (একই ধরণের) (auto a, decltype(a) b)সি ++ 14 এর মাধ্যমে সমাধান করা যেতে পারে ।
সেবাস্তিয়ান মাচ

13
পছন্দ করেছেন সেই সমাধানটি bঅ-ছাড় ছাড়াই হয় এবং এর যুক্তিটি স্পষ্টভাবে aপরিবর্তে প্রকারে রূপান্তরিত হবে।
কোয়ান্টিন

32

যেহেতু আপনি সি ++ 20 তে টেম্প্লেটেড ল্যাম্বডাস ব্যবহার করতে পারেন, আপনি নিজের প্রকারগুলিকে একটি SFINAE প্রকাশের চেয়ে সহজ উপায়ে সীমাবদ্ধ করতে পারেন:

auto lambda = []<typename T>(std::vector<T> t){};

এই ল্যাম্বদা কেবল ভেক্টর প্রকারের সাথেই কাজ করবে।


8
constevalনতুন সিনট্যাক্সের সাথে কীভাবে সম্পর্কিত? এটি দুর্দান্ত এবং সব কিছু, তবে আমি প্রাসঙ্গিকতা পাই না।
গল্পগ্রাহক - আনস্ল্যান্ডার মনিকা

প্রশ্নটির উত্তরের চেয়ে ল্যাম্বডা অভিব্যক্তিতে সি ++ 20 কী যুক্ত করে সে সম্পর্কে এটি আরও তথ্য
এন্টোইন মরিয়ার

24

প্রস্তাব যে সি ++ 20 মধ্যে গৃহীত হয় দীর্ঘ প্রেরণা অধ্যায়, উদাহরণ রয়েছে। এর ভিত্তি হ'ল:

জেনেরিক ল্যাম্বডাস সংজ্ঞায়নের জন্য বর্তমান সিনট্যাক্সকে লেখক অপর্যাপ্ত বলে মনে করার কয়েকটি মূল কারণ রয়েছে। এর সংক্ষিপ্তসারটি হ'ল কিছু সাধারণ জিনিস যা সাধারণ ফাংশন টেম্পলেটগুলির সাহায্যে সহজেই করা যায় তা জেনেরিক ল্যাম্বডাসের সাথে সম্পন্ন করার জন্য উল্লেখযোগ্য হুপ জাম্পিংয়ের প্রয়োজন হয় বা এটি মোটেও করা যায় না author লেখক মনে করেন যে ল্যাম্বডাস যথেষ্ট মূল্যবান যে সি ++ তাদের সমর্থন করা উচিত ঠিক পাশাপাশি সাধারণ ফাংশন টেম্পলেটগুলি।

এটি অনুসরণ করা বেশ কয়েকটি উদাহরণ।


21

সি ++ ২০ এ প্রবর্তিত ল্যাম্বডাসের জন্য নতুন "পরিচিত টেম্পলেট সিনট্যাক্স"  সি -+ 17 বিকল্পের তুলনায় যেমন কনস্ট্রাক্টসকে for_types এবং  for_rangeব্যবহারযোগ্য এবং আরও পঠনযোগ্য করে তোলে  ।

(উত্স: সি ++ ২০ ল্যাম্বডাসের সাথে সংকলন-সময় পুনরাবৃত্তি )

C ++ 14 এবং C ++ 17 জেনেরিক ল্যাম্বডাস উভয় ক্ষেত্রেই করা যেতে পারে এমন আরও একটি আকর্ষণীয় জিনিস operator() স্পষ্টভাবে একটি টেম্পলেট প্যারামিটারটি পাস করে কল করছে  :

সি ++ 14:

   auto l = [](auto){ };
   l.template operator()<int>(0);

সি ++ 20:

  auto l = []<typename T>(){ };
  l.template operator()<int>();

উপরের সি ++ 14 উদাহরণটি যথেষ্ট অকেজো: operator() যুক্তিটির নাম না দিয়ে এবং ব্যবহার না করে ল্যাম্বডায় দেহে  প্রদত্ত প্রকারটি উল্লেখ করার কোনও উপায় নেই  decltype। অতিরিক্তভাবে, আমাদের প্রয়োজন না হলেও আমরা একটি যুক্তি পাস করতে বাধ্য হই।

সি ++ 20 উদাহরণটি দেখায় যে কীভাবে টি ল্যাম্বার দেহে সহজেই অ্যাক্সেসযোগ্য এবং একটি নলারি ল্যাম্বদা এখন নির্বিচারে টেম্পলেট করা যেতে পারে। এটি পূর্বোক্ত সংকলন-সময় নির্মাণগুলি বাস্তবায়নের জন্য খুব কার্যকর হতে চলেছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.