আপনার যদি এমন কোনও ধরণের প্রয়োজন হয় যা কোনও ফাংশন কলের মতো std::result_of
না হয় তবে কেবল প্রযোজ্য হবে না। decltype()
আপনাকে যে কোনও অভিব্যক্তির ধরণ দিতে পারে।
যদি আমরা কোনও ফাংশন কল ( std::result_of_t<F(Args...)>
এবং এর মধ্যে decltype(std::declval<F>()(std::declval<Args>()...)
) রিটার্নের ধরণ নির্ধারণের বিভিন্ন উপায়ে কেবল নিজেদের মধ্যে সীমাবদ্ধ রাখি তবে তার মধ্যে পার্থক্য রয়েছে।
std::result_of<F(Args...)
হিসাবে সংজ্ঞায়িত করা হয়:
যদি INVOKE (declval<Fn>(), declval<ArgTypes>()...)
একটি অমূল্য অপারেন্ড (ক্লজ 5) হিসাবে বিবেচনা করা হয় তখন অভিব্যক্তিটি
ভালভাবে গঠন করা হয়, সদস্য টাইপডিফ টাইপটির নামটি decltype(INVOKE (declval<Fn>(), declval<ArgTypes>()...));
অন্যথায় রাখবেন, সদস্যের কোনও প্রকার থাকবে না।
এর মধ্যে পার্থক্য result_of<F(Args..)>::type
এবং decltype(std::declval<F>()(std::declval<Args>()...)
সব কিছু INVOKE
। টাইপ করতে বেশ খানিকটা দীর্ঘ সময় ছাড়াও declval
/ decltype
সরাসরি ব্যবহার করা কেবল তখনই বৈধ হয় যদি F
সরাসরি কলযোগ্য (কোনও ফাংশন অবজেক্টের ধরণ বা কোনও ফাংশন বা কোনও ফাংশন পয়েন্টার)। result_of
সদস্যদের ফাংশনগুলিতে পয়েন্টার এবং সদস্য ডেটারে পয়েন্টারগুলিকে সমর্থন করে।
প্রাথমিকভাবে, একটি SFINAE- বান্ধব এক্সপ্রেশন ব্যবহার declval
/ decltype
গ্যারান্টিযুক্ত, যেখানে std::result_of
আপনাকে ছাড়ের ব্যর্থতার পরিবর্তে একটি হার্ড ত্রুটি দিতে পারে। এটি C ++ 14 এ সংশোধন করা হয়েছে: std::result_of
এখন SFINAE- বান্ধব হওয়া দরকার ( এই কাগজটির জন্য ধন্যবাদ )।
সুতরাং একটি উপযুক্ত সি ++ 14 সংকলক, std::result_of_t<F(Args...)>
কঠোরভাবে উচ্চতর। এটা তোলে পরিষ্কার, খাটো, এবং সঠিকভাবে † সমর্থন আরো F
গুলি ‡ ।
† যদি না হয়, তবে আপনি এটি এমন একটি প্রসঙ্গে ব্যবহার করছেন যেখানে আপনি সদস্যদের পয়েন্টারগুলিকে মঞ্জুরি দিতে চান না, সুতরাং
std::result_of_t
এমন ক্ষেত্রে সাফল্য পাবেন যেখানে আপনি এটি ব্যর্থ হতে চাইতে পারেন।
Ceptions ব্যতিক্রম সহ। যদিও এটি সদস্যদের পয়েন্টারগুলিকে সমর্থন করে, result_of
আপনি কোনও অবৈধ টাইপ-আইডি ইনস্ট্যান্ট করার চেষ্টা করলে কাজ করবে না । এর মধ্যে একটি ফাংশন কোনও ফাংশন ফিরিয়ে দেওয়া বা মান অনুসারে অ্যাবস্ট্রাক্ট প্রকার গ্রহণ করা অন্তর্ভুক্ত থাকবে। প্রাক্তন:
template <class F, class R = result_of_t<F()>>
R call(F& f) { return f(); }
int answer() { return 42; }
call(answer);
সঠিক ব্যবহারটি হত result_of_t<F&()>
, তবে এটি এমন একটি বিবরণ যা আপনাকে মনে রাখতে হবে না decltype
।
decltype
কুশ্রী তবে আরও শক্তিশালী।result_of
কল করার জন্য শুধুমাত্র সেই ধরণের জন্য ব্যবহার করা যেতে পারে এবং এর জন্য আর্গুমেন্ট হিসাবে ধরণের প্রয়োজন। উদাহরণস্বরূপ, আপনিresult_of
এখানে ব্যবহার করতে পারবেন না :template <typename T, typename U> auto sum( T t, U u ) -> decltype( t + u );
যদি আর্গুমেন্টগুলি গাণিতিক ধরণের হতে পারে (এমন কোনও ফাংশন নেইF
যা আপনিF(T,U)
প্রতিনিধিত্ব করতে সংজ্ঞায়িত করতে পারেনt+u
user ব্যবহারকারীর সংজ্ঞায়িত প্রকারের জন্য আপনি যা করতে পারেন। একইভাবে (আমি এটির সাথে সত্যিই খেলিনি)) আমি কল্পনা করি সদস্য পদ্ধতিতে কলগুলিresult_of
বাইন্ডার বা