টেমপ্লেট ছাড়ের গাইড কী কী এবং আমাদের সেগুলি কখন ব্যবহার করা উচিত?


89

সি ++ 17 স্ট্যান্ডার্ড "টেম্পলেট ছাড়ের গাইডগুলি" উপস্থাপন করে। আমি সংগ্রহ করি তারা স্ট্যান্ডার্ডের এই সংস্করণে প্রবর্তিত কনট্রাক্টরদের জন্য নতুন টেম্পলেট আর্গুমেন্ট ছাড়ের সাথে করণীয়, তবে আমি তারা এখনও কি এবং তারা কী সে সম্পর্কে একটি সাধারণ, প্রায়শই জিজ্ঞাসিত-স্টাইল ব্যাখ্যা দেখতে পাইনি।

  • সি ++ 17 এ টেমপ্লেট ছাড়ের গাইড কী কী?

  • কেন আমাদের (এবং কখন) তাদের দরকার?

  • আমি তাদের কীভাবে ঘোষণা করব?



বিশেষত, আমি জানতে আগ্রহী যে কোনও ছাড়ের গাইডগুলি আসলে সি ++ 17 এসটিএল দ্বারা সরবরাহ করা হয়েছে (যেমন স্টাড :: জোড় বা এসটিডি :: টিপল)। সি ++ 17 হিসাবে "ছাড়যোগ্য" স্ট্যান্ডার্ড টেম্পলেট ধরণের সম্পূর্ণ তালিকা কী?
কুইকসপ্লসোন


কোনও সংকলক এটি সমর্থন করে কিনা তা জানতে আগ্রহী হব। আমি জিসিসি, কলঙ্ক এবং ভিসি ++ চেষ্টা করেছি tried rextester.com/DHPHC32332 কিছুই নয় , আমি খুঁজে পেয়েছি এটি কেবল gc ++ 8.1 C ++ 17 এবং 2a g ++ -std = c ++ 17 -O2 -Wall -pedantic -pthread main.cpp&&a/out.out
জিন-সাইমন ব্রোচু

উত্তর:


102

টেমপ্লেট ছাড়ের গাইডগুলি একটি টেম্পলেট শ্রেণীর সাথে সম্পর্কিত নিদর্শন যা সংস্থাপককে কীভাবে ক্লাসের টেম্পলেট প্যারামিটারে কনস্ট্রাক্টর আর্গুমেন্টগুলির সেট (এবং তাদের প্রকারগুলি) অনুবাদ করতে হয় তা বলে।

সবচেয়ে সহজ উদাহরণ std::vectorএটির এবং এর নির্মাণকারী যা একটি পুনরুক্তি জুড়ি নেয়।

template<typename Iterator>
void func(Iterator first, Iterator last)
{
  vector v(first, last);
}

কম্পাইলার জিনিসটা কি দরকার vector<T>'র Tটাইপ হবে। আমরা উত্তর জানি কি; Tহওয়া উচিত typename std::iterator_traits<Iterator>::value_type। তবে আমরা কীভাবে সংকলকটি বলি ছাড়া টাইপ করা vector<typename std::iterator_traits<Iterator>::value_type>?

আপনি একটি ছাড়ের গাইড ব্যবহার করেন:

template<typename Iterator> vector(Iterator b, Iterator e) -> 
    vector<typename std::iterator_traits<Iterator>::value_type>;

এটি সংকলককে বলে যে আপনি যখন vectorসেই প্যাটার্নটির সাথে মিলে কোনও কনস্ট্রাক্টর কল করবেন তখন এটিটি কেটে যাবেvector তখন ডানদিকে কোডটি ব্যবহার করে বিশেষীকরণটি->

আপনার যদি গাইডের দরকার হয় যখন আর্গুমেন্টগুলি থেকে প্রকারের কর্তন those যুক্তিগুলির একটির প্রকারের ভিত্তিতে নয়। একটি আরম্ভ করা vectorএকটি থেকে initializer_listস্পষ্টভাবে ব্যবহার vectorএরT , সুতরাং এটির গাইডের প্রয়োজন নেই।

বাম দিক অগত্যা একটি প্রকৃত নির্মাণকারী নির্দিষ্ট করে না। এটি যেভাবে কাজ করে তা হ'ল, যদি আপনি কোনও ধরণের টেম্পলেট কনস্ট্রাক্টর ছাড়ের ব্যবহার করেন তবে এটি সমস্ত ছাড়ের গাইডের (প্রাথমিক টেমপ্লেটের প্রকৃত নির্মাতারা অন্তর্নিহিত গাইড সরবরাহ করে) বিরুদ্ধে আপনি যে যুক্তিগুলি দিয়ে যান তার সাথে এটি মেলে। যদি কোনও মিল থাকে তবে এটি কোনও টেমপ্লেট আর্গুমেন্টকে প্রকারটি সরবরাহ করবে তা নির্ধারণ করতে এটি ব্যবহার করে।

তবে একবার যদি এই ছাড়টি শেষ হয়ে যায়, একবার সংকলক টাইপের টেম্পলেট প্যারামিটারগুলি বের করে দেয়, সেই ধরণের অবজেক্টটির জন্য আরম্ভকরণটি এমনভাবে এগিয়ে যায় যেন সেটির কিছুই ঘটেনি। অর্থাত, নির্বাচিত কর্তন গাইডটি নির্বাচিত কনস্ট্রাক্টরের সাথে মেলে না ।

এর অর্থ হ'ল আপনি সমষ্টি এবং সামগ্রিক সূচনা সহ গাইডগুলি ব্যবহার করতে পারেন:

template<typename T>
struct Thingy
{
  T t;
};

Thingy(const char *) -> Thingy<std::string>;

Thingy thing{"A String"}; //thing.t is a `std::string`.

সুতরাং ছাড়ের গাইডগুলি কেবল প্রারম্ভিক হওয়ার ধরণটি সনাক্ত করতে ব্যবহৃত হয়। আরম্ভের আসল প্রক্রিয়া ঠিক আগের মতোই কাজ করে, একবার দৃ determination় সংকল্প হয়ে গেলে।


7
হুম, এটি আমার কাছে কেবল ঘটেছে যে গাইডের সাথেও, vector v{first, last};সঠিক কাজটি করবে না :(
টিসি

4
@ টিটিসি ... যদি না সঠিক জিনিস পুনরাবৃত্তির একটি ভেক্টর তৈরি করে। এবং std::string{32,'*'}[0] == ' '(এএসসিআইআইয়ের জন্য)। তবে সি ++ 11 সাল থেকে এটি সমস্ত সত্য।
আর্ন ভোগেল

4
বরাদ্দকারী ভেক্টর পরামিতি দিয়ে কী ঘটে? যদি বরাদ্দকারী ভেক্টর প্যারামিটারের ডিফল্ট যুক্তি না থাকে তবে কী হবে? (আপনি এটি ইনপুটআইট্রেটর থেকে অনুমান করতে পারবেন না)
gnzlbg

@ নিকলবোলাস: আংশিক বা সম্পূর্ণ বিশেষায়িত শ্রেণীর (যার নির্মাতাদের প্রাথমিকভাবে টেমপ্লেটের সাথে মেলে এমন প্যারামিটার ধরণের দরকার নেই) এর প্রসঙ্গে কীভাবে অন্তর্নিহিত এবং সুস্পষ্টভাবে ছাড়ের নির্দেশিকা কাজ করতে পারে তার বিশদটি ব্যাখ্যা করতে আপনি কি আপত্তি করবেন? দ্রুত অনুসন্ধানের মাধ্যমে এ সম্পর্কিত তথ্য পাওয়া শক্ত।
ব্যবহারকারী541686

4
@ নিকোলবোলাস: আমি দেখছি। আমার কাছে এটি পরিষ্কার নয় যে প্রশ্নটি মোটেও সুস্পষ্ট ছাড়ের গাইড সম্পর্কে about আমি মনে করি এটি সহায়ক বলে যদি আপনি এই মন্তব্যে আক্ষরিকভাবে যা লিখেছিলেন কেবল তা অন্তর্ভুক্ত করেন।
ব্যবহারকারী541686
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.