অস্তিত্বের কারণ কী std::decay
? কোন পরিস্থিতিতে std::decay
দরকারী?
decay_t<decltype(...)>
কি auto
হ্রাস হবে তা দেখতে একটি দুর্দান্ত সমন্বয় ।
অস্তিত্বের কারণ কী std::decay
? কোন পরিস্থিতিতে std::decay
দরকারী?
decay_t<decltype(...)>
কি auto
হ্রাস হবে তা দেখতে একটি দুর্দান্ত সমন্বয় ।
উত্তর:
<জোক> এটি স্পষ্টতই তেজস্ক্রিয় std::atomic
ধরণের ক্ষয়র জন্য অ-তেজস্ক্রিয় উপাদানগুলিতে ব্যবহৃত হয় </ </ জোক>
এন 2609 প্রস্তাবিত কাগজ std::decay
। কাগজটি ব্যাখ্যা করেছে:
সোজা কথায়,
decay<T>::type
পরিচয় টাইপ-ট্রান্সফর্মেশনটি হ'ল টি যদি অ্যারে টাইপ বা কোনও ফাংশনের ধরণের রেফারেন্স হয়। এই ক্ষেত্রেdecay<T>::type
যথাক্রমে একটি ফাংশনে একটি পয়েন্টার বা পয়েন্টার উপার্জন করে।
প্রেরণাদায়ী উদাহরণটি সি ++ 03 std::make_pair
:
template <class T1, class T2>
inline pair<T1,T2> make_pair(T1 x, T2 y)
{
return pair<T1,T2>(x, y);
}
যা স্ট্রিং আক্ষরিক কাজ করতে মান দ্বারা তার পরামিতি গ্রহণ করেছে:
std::pair<std::string, int> p = make_pair("foo", 0);
যদি রেফারেন্স অনুসারে এটি এর পরামিতিগুলি স্বীকার করে, তবে T1
একটি অ্যারে টাইপ হিসাবে ছাড় করা হবে, এবং তারপরে একটি নির্মাণ pair<T1, T2>
করা খারাপ-গঠন হবে।
তবে স্পষ্টতই এটি উল্লেখযোগ্য অদক্ষতার দিকে পরিচালিত করে। অতএব, decay
পাস-বাই-মানটি ঘটে যখন রূপান্তরগুলির সেটটি প্রয়োগ করার জন্য প্রয়োজনীয়তাটি আপনাকে রেফারেন্সের মাধ্যমে পরামিতিগুলি গ্রহণের দক্ষতা পেতে সক্ষম করে, তবে আপনার কোডটির স্ট্রিং লিটারেলগুলির সাথে কাজ করার জন্য প্রয়োজনীয় ধরণের রূপান্তরগুলি পেতে, অ্যারের ধরণ, ফাংশনের ধরণ এবং এর মতো:
template <class T1, class T2>
inline pair< typename decay<T1>::type, typename decay<T2>::type >
make_pair(T1&& x, T2&& y)
{
return pair< typename decay<T1>::type,
typename decay<T2>::type >(std::forward<T1>(x),
std::forward<T2>(y));
}
দ্রষ্টব্য: এটি আসল সি ++ 11 make_pair
বাস্তবায়ন নয় - সি ++ 11 make_pair
টিও সরিয়ে দেয় std::reference_wrapper
।
টেমপ্লেট ফাংশনগুলির সাথে কাজ করার সময় যা কোনও টেম্পলেট ধরণের পরামিতি নেয়, আপনার প্রায়শই সর্বজনীন পরামিতি থাকে। ইউনিভার্সাল প্যারামিটারগুলি প্রায়শই এক ধরণের বা অন্যরকমের উল্লেখ। তারাও কনস্ট-অস্থির যোগ্য। এই হিসাবে, বেশিরভাগ ধরণের বৈশিষ্ট্যগুলি আপনি যেমন আশা করেছিলেন তেমন সেগুলি নিয়ে কাজ করে না:
template<class T>
void func(T&& param) {
if (std::is_same<T,int>::value)
std::cout << "param is an int\n";
else
std::cout << "param is not an int\n";
}
int main() {
int three = 3;
func(three); //prints "param is not an int"!!!!
}
http://coliru.stacked-crooked.com/a/24476e60bd906bed
সমাধানটি এখানে ব্যবহার করুন std::decay
:
template<class T>
void func(T&& param) {
if (std::is_same<typename std::decay<T>::type,int>::value)
std::cout << "param is an int\n";
else
std::cout << "param is not an int\n";
}
decay
খুব আক্রমণাত্মক, উদাহরণস্বরূপ যদি অ্যারেতে কোনও রেফারেন্স প্রয়োগ করা হয় তবে এটি একটি পয়েন্টার দেয়। এটি সাধারণত এই জাতীয় রূপক আইএমএইচওর জন্য খুব আক্রমণাত্মক।
remove_const_t< remove_reference_t<T> >
একটি কাস্টম মেটাফ্যাঙ্কশনে আবৃত ছিলাম ।