সি ++ 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 কিছুটা স্পষ্টতই এটি টেমপ্লেটগুলি দিয়ে সম্পন্ন করা যায় না, তবে কিছু কংক্রিটের ধরণ রয়েছে (সাধারণত টেমপ্লেট রূপক দ্বারা উত্পন্ন) অন্যথায় লেখা শক্ত।