ফাংশন শিরোনামে তীর অপারেটর (->)


128

আমি নিম্নলিখিত কোড জুড়ে এসেছি:

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
   return a+b;
}

আমি বুঝতে পারি না এমন একটি জিনিস রয়েছে:

->ফাংশন শিরোনামে তীর অপারেটর ( ) এর অর্থ কী তা আমি কোথায় জানতে পারি ? আমি নির্ভুলভাবে যুক্তিযুক্তভাবে অনুমান করি যে ->অপারেটর একটি প্রকার নির্ধারণ করে, যার autoজন্য ছাড় করা হবে, তবে আমি এটি সরাসরি পেতে চাই। আমি কোন তথ্য খুঁজে পাচ্ছি না।


2
এটি পেছনের রিটার্ন টাইপ সিনট্যাক্সের অংশ। Stackoverflow.com/a/4113390/962089
ক্রিস

2
এটি অপারেটর নয়, সিনট্যাক্সের একটি অংশ।
টেক্সাসব্রুস

1
"আমি কোথায় পড়তে পারি?" এর উত্তরে, সি ++ স্পেক সর্বাধিক অনুমোদিত। তহবিলের অভাব বা ব্যয় করার ইচ্ছা $$, শেষ কার্যকরী খসড়া প্রায়শই পর্যাপ্ত এবং কোনও দাম ব্যয় করে না। এই চশমাগুলি অত্যন্ত টেকো-স্পোক, সুতরাং আইএসও স্পেসগুলি পড়ার সাথে পরিচিতির অভাব রয়েছে, cplusplus.com বা cppreferences.com বা এই জাতীয় সাইটগুলি চেষ্টা করুন যা অনুমোদনযোগ্য নয় তবে সাধারণত খুব নির্ভুল হয়। দ্রষ্টব্য: ট্র্যাকিং রিটার্ন টাইপ সি ++ 14 দিয়ে বাদ দেওয়া যেতে পারে।
লেস

উত্তর:


205

সি ++ 11 এ, ফাংশন ঘোষণার জন্য দুটি বাক্য গঠন রয়েছে:

    রিটার্ন-টাইপ শনাক্তকারী ( যুক্তি-ঘোষণা ... )

এবং

    auto সনাক্তকারী ( যুক্তি-ঘোষণা ... ) -> রিটার্ন_ টাইপ

তারা সমতুল্য। এখন যখন তারা সমতুল্য হয়, আপনি কেন কখনও উত্তরগুলি ব্যবহার করতে চান? ঠিক আছে, সি ++ 11 এই দুর্দান্ত decltypeজিনিসটি চালু করেছে যা আপনাকে কোনও অভিব্যক্তির ধরণের বর্ণনা দিতে দেয়। সুতরাং আপনি আর্গুমেন্টের ধরণ থেকে রিটার্নের ধরণটি পেতে চান। সুতরাং আপনি চেষ্টা করুন:

template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);

এবং কম্পাইলার আপনাকে বলবে যে এটা কি জানে না aএবং bহয় decltypeযুক্তি। কারণ তারা কেবল যুক্তি তালিকার দ্বারা ঘোষিত হয়।

declvalইতিমধ্যে ঘোষিত টেম্পলেট প্যারামিটারগুলি ব্যবহার করে আপনি সহজেই সমস্যাটি সমাধান করতে পারেন । ভালো লেগেছে:

template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);

এটি এখন সত্যিই ভার্বোজ পেয়ে ব্যতীত। সুতরাং বিকল্প ঘোষণার সিনট্যাক্স প্রস্তাবিত এবং প্রয়োগ করা হয়েছিল এবং এখন আপনি লিখতে পারেন

template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);

এবং এটি কম ভার্বোজ এবং স্কোপিংয়ের নিয়মগুলি পরিবর্তনের প্রয়োজন হয়নি।


সি ++ 14 আপডেট: সি ++ 14 কেবলমাত্র অনুমতি দেয়

    auto সনাক্তকারী ( যুক্তি-ঘোষণা ... )

যতক্ষণ না ব্যবহারের আগে ফাংশনটি সম্পূর্ণরূপে সংজ্ঞায়িত হয় এবং সমস্ত returnবিবৃতি একই ধরণের অনুমিত হয়। ->যদি আপনি উত্স ফাইলে দেহটি আড়াল করতে চান তবে সিনট্যাক্সটি জনসাধারণের কার্যক্রমে (শিরোনামে ঘোষিত) দরকারী useful কিছুটা স্পষ্টতই এটি টেমপ্লেটগুলি দিয়ে সম্পন্ন করা যায় না, তবে কিছু কংক্রিটের ধরণ রয়েছে (সাধারণত টেমপ্লেট রূপক দ্বারা উত্পন্ন) অন্যথায় লেখা শক্ত।


2
খুব ভাল, ঝরঝরে এবং তথ্যমূলক জবাব @ জান হুডেক। দুম্ শব্দে আঘাত. C++14আমি অংশটির প্রয়োজন ছাড়াই এই জাতীয় ফাংশনে টাইপ করার autoজন্য কিছু পরিবর্তন করেছি । এটি এখনই অনর্থক বা এটি এখনও ব্যবহার করা উচিত যেখানে অন্যান্য ক্ষেত্রে আছে? বা এটি একটি সংকলক নির্দিষ্ট এক্সটেনশন? return-> decltype(a + b)
শাদি

1
@ শাদী, সি ++ ১৪ এর মধ্যে এন 6363৩৮ অন্তর্ভুক্ত রয়েছে , যা প্রত্যাবর্তন autoছাড়াই ঘোষিত রিটার্নের ধরণের ছাড়ের অনুমতি দেয় ->, যতক্ষণ না ব্যবহারের আগে ফাংশনটি সম্পূর্ণরূপে সংজ্ঞায়িত হয় এবং সমস্ত returnবিবৃতি একই ধরণের পরিমিত হয়। ->স্বরলিপি সময় আপনি সোর্স ফাইল শরীরের গোপন প্রকাশ্য ফাংশন জন্য সিদ্ধান্তগ্রহণ ব্যবহার করতে চান তাহলে এখনও দরকারী।
জানু হুডেক

23

প্লেইন ইংরেজিতে এটা বলে যে রিটার্ন টাইপ এর সমষ্টি এর অনুমিত ধরনের aএবং b

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