জেনেরিক ল্যাম্বদা সি ++ 14 এ কীভাবে কাজ করে?


114

জেনেরিক ল্যাম্বডা কীভাবে autoসি ++ 14 স্ট্যান্ডার্ডে ( আর্গুমেন্টের ধরণ হিসাবে কীওয়ার্ড) কাজ করে?

এটি কি সি ++ টেম্পলেটগুলির উপর ভিত্তি করে যেখানে প্রতিটি পৃথক যুক্তির জন্য টাইপ সংকলক একই শরীরের সাথে প্রতিস্থাপিত প্রকারগুলি (সংকলন-সময় পলিমারফিজম) দিয়ে একটি নতুন ফাংশন তৈরি করে বা এটি জাভা জেনেরিকের (টাইপ ইরেজরের) সাথে আরও অনুরূপ?

কোড উদাহরণ:

auto glambda = [](auto a) { return a; };

6
সি ++ ১৪ এ স্থির করা হয়েছে, মূলত প্রশ্নে সি ++ 11 ব্যবহৃত হয়েছে
sasha.sochka

উত্তর:


130

জেনেরিক ল্যাম্বডাস চালু হয়েছিল C++14

সহজভাবে, ল্যাম্বডা এক্সপ্রেশন দ্বারা সংজ্ঞায়িত ক্লোজারের ধরণের ল্যাম্বডাসের নিয়মিত, নন-টেম্পলেট কল অপারেটরের পরিবর্তে একটি টেম্প্লেটেড কল অপারেটর থাকবে C++11(অবশ্যই, autoপ্যারামিটার তালিকায় অন্তত একবার উপস্থিত হলে )।

সুতরাং আপনার উদাহরণ:

auto glambda = [] (auto a) { return a; };

glambdaএই ধরণের উদাহরণ তৈরি করবে :

class /* unnamed */
{
public:
    template<typename T>
    T operator () (T a) const { return a; }
};

সি ++ ১৪ স্ট্যান্ডার্ড খসড়া n3690 এর 5.5.2 / 5 অনুচ্ছেদটি প্রদত্ত ল্যাম্বডা এক্সপ্রেশনটির ক্লোজার ধরণের কল অপারেটরকে কীভাবে সংজ্ঞায়িত করা হয়েছে তা নির্দিষ্ট করে:

জেনারিক-ল্যাম্বা-এক্সপ্রেশন-এর ক্লোজার টাইপটিতে একটি পাবলিক ইনলাইন ফাংশন কল অপারেটর রয়েছে (১৩.৫.৪) যার পরামিতি এবং রিটার্ন টাইপ যথাক্রমে ল্যাম্বডা-এক্সপ্রেশনটির প্যারামিটার-ডিক্লেয়ারেশন-ক্লজ এবং ট্রেলিং-রিটার্ন-টাইপ দ্বারা বর্ণিত। জেনেরিক ল্যাম্বডারের জন্য, ক্লোজার টাইপটিতে একটি পাবলিক ইনলাইন ফাংশন কল অপারেটর সদস্য টেম্পলেট (১৪.৫.২) থাকে যার টেম্পলেট-প্যারামিটার-তালিকায় ল্যাম্বদার প্যারামিটার-ডিক্লারেশন ক্লজটিতে অটো-এর প্রতিটি ঘটনার জন্য একটি উদ্ভাবিত ধরণের টেম্পলেট-প্যারামিটার থাকে, উপস্থিতির ক্রমানুসারে। উদ্ভাবিত ধরণের টেম্পলেট-পরামিতি একটি প্যারামিটার প্যাক হয় যদি সংশ্লিষ্ট পরামিতি-ঘোষণাপত্র কোনও ফাংশন প্যারামিটার প্যাক ঘোষণা করে (8.3.5)। ফাংশন কল অপারেটর টেমপ্লেটের রিটার্নের ধরণ এবং ফাংশন প্যারামিটারগুলি ল্যাম্বডা-এক্সপ্রেশনটির ট্রেলিং-রিটার্ন-টাইপ এবং প্যারামিটার-ডিক্লেয়ারেশন ক্লাজ থেকে প্যারামিটার-ডিক্লেয়ারেশন-ক্লজের নামের সাথে ডেল-স্পেসিফায়ারে প্রতিটির পরিবর্তনের মাধ্যমে প্যারামিটার-ডিক্লেয়ারেশন ক্লাজ হয় are সংশ্লিষ্ট উদ্ভাবিত টেমপ্লেট-প্যারামিটার।

অবশেষে:

এটি কি টেমপ্লেটগুলির মতো যেখানে প্রতিটি পৃথক যুক্তির জন্য টাইপ সংকলক একই শরীরের সাথে পরিবর্তিত প্রকারের সাথে ফাংশন উত্পন্ন করে বা এটি জাভার জেনেরিকগুলির সাথে আরও সাদৃশ্যপূর্ণ?

উপরের অনুচ্ছেদে যেমন ব্যাখ্যা করা হয়েছে, জেনেরিক ল্যাম্বডাস কেবল একটি টেম্প্লেটেড কল অপারেটরের সাথে অনন্য, নামবিহীন ফান্টকারদের জন্য সিনট্যাকটিক চিনি। যে আপনার প্রশ্নের উত্তর দিতে হবে :)


7
যাইহোক, তারা একটি টেমপ্লেট পদ্ধতিতে স্থানীয়ভাবে সংজ্ঞায়িত শ্রেণিকেও অনুমতি দেয়। যা নতুন।
ইয়াক্ক - অ্যাডাম নেভ্রামুমন্ট

2
@ ইয়াক্ক: ইতিমধ্যে সি ++ 11 দিয়ে ফাংশন-স্থানীয় টেম্পলেটগুলির জন্য নিষেধাজ্ঞাগুলি পুরোপুরি হ্রাস হয়নি?
সেবাস্তিয়ান মাচ

2
@ ফ্রেসনেল: না, নিষেধাজ্ঞাগুলি তোলা হয়নি
অ্যান্ডি প্রোল

1
@ অ্যান্ডিপ্রল: আমি আমার ভুল বুঝতে পেরেছি। কী উত্থাপিত হয়েছিল তা স্থানীয় ধরণের টেমপ্লেট আর্গুমেন্ট হিসাবে ব্যবহার করা হয়েছিল (যেমন রয়েছে int main () { struct X {}; std::vector<X> x; })
সেবাস্তিয়ান ম্যাচ

1
@ ফ্রেসনেল: ঠিক আছে, এটি সত্যই পরিবর্তিত হয়েছে
অ্যান্ডি প্রোল

25

দুর্ভাগ্যক্রমে , তারা সি ++ 11 ( http://ideone.com/NsqYuq ) এর অংশ নয় :

auto glambda = [](auto a) { return a; };

int main() {}

জি ++ 4.7 সহ:

prog.cpp:1:24: error: parameter declared auto
...

তবে জেনেরিক ল্যাম্বডাসের জন্য পোর্টল্যান্ডের প্রস্তাব অনুযায়ী সি ++ 14 এ যেভাবে এটি প্রয়োগ করা যেতে পারে :

[](const& x, & y){ return x + y; }

এটি সবচেয়ে বড় অংশটির জন্য বেনামে ফ্যান্ট্যাক্টর শ্রেণির স্বাভাবিক তৈরির জন্য উত্পন্ন করবে, তবে প্রকারের অভাবের সাথে সংকলক একটি টেম্প্ল্যাটেড সদস্যকে নির্গত করবে- operator():

struct anonymous
{
    template <typename T, typename U>
    auto operator()(T const& x, U& y) const -> decltype(x+y)
    { return x + y; }
};

বা নতুন প্রস্তাব অনুসারে জেনেরিক (পলিমর্ফিক) লাম্বদা এক্সপ্রেশনগুলির প্রস্তাবনা

auto L = [](const auto& x, auto& y){ return x + y; };

--->

struct /* anonymous */
{
    template <typename T, typename U>
    auto operator()(const T& x, U& y) const // N3386 Return type deduction
    { return x + y; }
} L;

হ্যাঁ, প্রতিটি প্যারামিটারের ক্রমবর্ধনের জন্য, একটি নতুন তাত্ক্ষণিক উত্থান হবে, তবে, সেই ফান্টারের সদস্যরা এখনও ভাগ করে নেওয়া হবে (অর্থাত্ বন্দী যুক্তিগুলি)।


6
টাইপ-স্পেসিফায়ার বাদ দেওয়ার অনুমতি দেওয়ার সেই প্রস্তাবটি সম্পূর্ণ কৌতুকপূর্ণ।
অরবিটে হালকা ঘোড়দৌড়

তারা জি ++ - 4.9 নিয়ে গেছে । আপনি সরবরাহ করতে হবে -std=c++1y
এমএসআর

আমি বুঝতে পারিনি যে আইডোনটির এখনও জিসিসি-৪.৯ এবং সি ++ ১৪ নেই।
ইএমএসআর

প্রশ্ন: autoক্লাসিক অটোয়ের তুলনায় এর কি একই ছাড়ের নিয়ম রয়েছে? যদি আমরা টেম্প্লেটেড উপমাটি উল্লেখ করি তবে এর অর্থ হ'ল অটো স্বয়ংক্রিয় নয়, এটি টেমপ্লেট প্রকারের ছাড়ের মতো একই নিয়ম। তাহলে প্রশ্নটি হল: টেম্পলেট ছাড়ের সমতুল্য autoকি?
v.oddou

@ ভি.ডডু: "ক্লাসিক অটো" ভাল। আমার কাছে, "ক্লাসিক অটো" অর্থ "স্ট্যাক ভেরিয়েবল", এবং এটি একবার staticবা এর বিপরীতে ব্যবহৃত হয়েছিল register:) যাইহোক, autoহুড, সেখানে ব্যবহার করার অর্থ হুডের নীচে একটি সাধারণ টেম্পলেট উত্পন্ন হয়। প্রকৃতপক্ষে, একটি ল্যাম্বডা সংকলক-অভ্যন্তরীণভাবে একটি ফান্ট্যাক্টর ক্লাস দ্বারা প্রতিস্থাপন করা হবে এবং একটি autoপরামিতিটির অর্থ এটি template <T> ... (T ...)নির্গত হবে।
সেবাস্তিয়ান মাচ

17

এটি প্রস্তাবিত সি ++ 14 বৈশিষ্ট্য (সি ++ 11 তে নয়) টেমপ্লেটের অনুরূপ (বা সমতুল্য)। উদাহরণস্বরূপ, N3559 এই উদাহরণ সরবরাহ করে:

উদাহরণস্বরূপ, এই জেনেরিক ল্যাম্বডা-এক্সপ্রেশনটিতে বিবৃতি রয়েছে:

auto L = [](const auto& x, auto& y){ return x + y; };

নীচের কাঠামোর অনুরূপ আচরণ করে এমন একটি ক্লোজার টাইপ এবং অবজেক্ট তৈরির ফলস্বরূপ:

struct /* anonymous */
{
    template <typename T, typename U>
    auto operator()(const T& x, U& y) const // N3386 Return type deduction
    { return x + y; }
} L;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.