নিম্নলিখিত ক্ষেত্রে নির্ভরশীল ধরণের জন্য টাইপনেম ব্যবহার করার প্রয়োজন নেই কেন?


10

আমি এখানে একটি ধরণের রেফারেন্স অপসারণ সম্পর্কে পড়া হয়েছে

এটি নিম্নলিখিত উদাহরণ দেয়:

#include <iostream> // std::cout
#include <type_traits> // std::is_same

template<class T1, class T2>
void print_is_same() {
  std::cout << std::is_same<T1, T2>() << '\n';
}

int main() {
  std::cout << std::boolalpha;

  print_is_same<int, int>();
  print_is_same<int, int &>();
  print_is_same<int, int &&>();

  print_is_same<int, std::remove_reference<int>::type>(); // Why not typename std::remove_reference<int>::type ?
  print_is_same<int, std::remove_reference<int &>::type>();// Why not typename std::remove_reference<int &>::type ?
  print_is_same<int, std::remove_reference<int &&>::type>();// Why not typename std::remove_reference<int &&>::type ?
}

typeমধ্যে গুলি std::remove_referenceবৈশিষ্ট্যগুলো নির্ভরশীল ধরনের হয়।

সম্ভাব্য বাস্তবায়ন

template< class T > struct remove_reference      {typedef T type;};
template< class T > struct remove_reference<T&>  {typedef T type;};
template< class T > struct remove_reference<T&&> {typedef T type;};

কিন্তু কেন এটি ব্যবহার করে না typename std::remove_reference</*TYPE*/>::type?

উত্তর:


22

typeমধ্যে গুলি std::remove_referenceবৈশিষ্ট্যগুলো নির্ভরশীল ধরনের হয়।

না, তারা এখানে নির্ভরশীল নাম নয় । টেমপ্লেট আর্গুমেন্ট স্পষ্টভাবে হিসাবে নির্দিষ্ট করা হয়েছে int, int&এবং int&&। সুতরাং, প্রকারগুলি এই মুহুর্তে জানা যায় are

অন্যদিকে, আপনি যদি std::remove_referenceকোনও টেম্পলেট প্যারামিটার ব্যবহার করেন, যেমন

template <typename T>
void foo() {
    print_is_same<int, typename std::remove_reference<T>::type>();
}

তারপরে আপনাকে typenameবলতে হবে যে std::remove_reference<T>::typeএটি টাইপ কারণ আপনার এক্সপ্রেশনটি এখন টেম্পলেট প্যারামিটারের উপর নির্ভর করে T


5

সংক্ষেপে, আপনাকে typenameযে সংকলকটি তা নিশ্চিত করতে হবে

std::remove_reference<int>::type

সত্যিই এক প্রকার। অন্য কিছু টেম্পলেট বিবেচনা করা যাক

template <typename T>
struct foo {
    using type = int;
};

এখানে foo::typeএকটি টাইপ। তবে কেউ যদি লাইন ধরে বিশেষায়িতকরণ সরবরাহ করে

template <> struct foo<int> {
    int type;
};

এখন typeনা একটি টাইপ কিন্তু একটি হল int। এখন যখন আপনি কোনও টেমপ্লেটের অভ্যন্তরে ফু ব্যবহার করেন:

template <typanem T> 
struct bar {
    using type = typename foo<T>::type;
};

আপনাকে এই সংকলকটি নিশ্চিত করতে হবে যে foo<T>::typeপ্রকৃতপক্ষে একটি প্রকার, অন্য কিছু নয়, কারণ কেবলমাত্র bar(এবং প্রাথমিক টেম্পলেট foo) তাকিয়ে সংকলকটি এটি জানতে পারে না।

যাইহোক, আপনার mainমধ্যে std::remove_reference<int>::typeকোনও টেম্পলেট প্যারামিটারের উপর নির্ভর করে না, তাই সংকলক সহজেই এটি কোনও ধরণের কিনা তা পরীক্ষা করতে পারে।


0

শব্দ typename সাহায্যের কম্পাইলার সোর্স বিশ্লেষণ করতে ব্যবহার করা হয়। এটি আইডিটি উল্লেখ করে যে কোনও প্রকারের নাম, কোনও ভেরিয়েবলের নাম বা পদ্ধতির নাম নয়। তবে উপরের সংকলকের মতো পরিস্থিতিতে এটি নিজেই বের করতে পারে, সুতরাং এই কীওয়ার্ডটির প্রয়োজন নেই।

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