স্কট মায়ার্স তার পরবর্তী বই ইসি ++ 11 এর সামগ্রী এবং স্থিতি পোস্ট করেছেন । তিনি লিখেছেন যে বইয়ের একটি আইটেম " std::enable_if
ফাংশন স্বাক্ষরে এড়ানো" হতে পারে ।
std::enable_if
অতিরিক্ত লোড রেজোলিউশন থেকে শর্তাধীন ফাংশন বা ক্লাস অপসারণ করতে একটি ফাংশন আর্গুমেন্ট হিসাবে, রিটার্ন টাইপের হিসাবে বা ক্লাস টেম্পলেট বা ফাংশন টেম্পলেট প্যারামিটার হিসাবে ব্যবহৃত হতে পারে।
ইন এই প্রশ্নের তিনটি সমাধান দেখানো হয়।
ফাংশন প্যারামিটার হিসাবে:
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
টেমপ্লেট প্যারামিটার হিসাবে:
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
রিটার্ন টাইপ হিসাবে:
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- কোন সমাধানটিকে অগ্রাধিকার দেওয়া উচিত এবং কেন আমি অন্যদের এড়ানো উচিত?
- কোন ক্ষেত্রে "
std::enable_if
ফাংশন স্বাক্ষরগুলি এড়ান" রিটার্ন টাইপ হিসাবে ব্যবহারের বিষয়ে উদ্বেগ প্রকাশ করে (যা সাধারণ ফাংশনের স্বাক্ষরের অংশ নয় তবে টেমপ্লেট বিশেষীকরণের)? - সদস্য এবং অ-সদস্য ফাংশন টেম্পলেটগুলির জন্য কোনও পার্থক্য রয়েছে?
std::enable_if
আমার ফাংশন স্বাক্ষর (বিশেষ করে কুশ্রী অতিরিক্ত বিশৃঙ্খল করতে nullptr
ফাংশন যুক্তি সংস্করণ) কারণ এটা সবসময় (কিছু জন্য এটি কি মনে হচ্ছে, একটি অদ্ভুত হ্যাক static if
শক্তি আন্তঃবিশ্বের ভাষা বৈশিষ্ট্যটি ব্যবহার করতে টেমপ্লেট কালো-যাদু ব্যবহার করে আরও বেশি সুন্দর এবং পরিষ্কার করুন। এ কারণেই আমি যখনই সম্ভব ট্যাগ-প্রেরণ পছন্দ করি (ভাল, আপনার কাছে এখনও অতিরিক্ত অদ্ভুত যুক্তি রয়েছে, তবে পাবলিক ইন্টারফেসে নয় এবং এর চেয়ে কম কদর্য এবং ক্রিপ্টিকও রয়েছে )।
=0
মধ্যে typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
সাধা? আমি এটি বুঝতে সঠিক সংস্থান খুঁজে পাইনি। আমি প্রথম অংশ হবার আগেই =0
একজন সদস্য টাইপ হয়েছে int
যদি U
এবং int
একই। অনেক ধন্যবাদ!