নীচে GoingNative 2012 এ আন্দ্রে আলেকজান্দ্রেস্কুর "ভারিয়াদিক টেম্পলেটগুলি ফানাদিক" শীর্ষক আলাপ থেকে নেওয়া হয়েছে vari আমি এটি বৈকল্পিক টেম্পলেটগুলির জন্য একটি ভাল পরিচিতির জন্য সুপারিশ করতে পারি।
একটি ভ্যারিয়েডিক প্যাক দিয়ে দুটি জিনিস করতে পারে। sizeof...(vs)উপাদানগুলির সংখ্যা পেতে এবং এটি প্রসারিত করার জন্য প্রয়োগ করা সম্ভব ।
প্রসারণ বিধি
Use Expansion
Ts... T1, ..., Tn
Ts&&... T1&&, ..., Tn&&
x<Ts,Y>::z... x<T1,Y>::z, ..., x<Tn,Y>::z
x<Ts&,Us>... x<T1&,U1>, ..., x<Tn&,Un>
func(5,vs)... func(5,v1), ..., func(5,vn)
বিস্তৃতি ভিতরের দিকে দিকে এগিয়ে যায়। লক-স্টেপে দুটি তালিকা প্রসারিত করার সময়, তাদের একই আকার থাকতে হবে।
আরও উদাহরণ:
gun(A<Ts...>::hun(vs)...);
Tsএর টেম্পলেট আর্গুমেন্ট তালিকায় সমস্তটি প্রসারিত করে Aএবং তারপরে hunসমস্তটির সাথে ফাংশনটি প্রসারিত হয় vs।
gun(A<Ts...>::hun(vs...));
সমস্ত Tsটেমপ্লেট আর্গুমেন্ট তালিকায় Aএবং সমস্ত vsফাংশন আর্গুমেন্ট হিসাবে প্রসারিত করে hun।
gun(A<Ts>::hun(vs)...);
লক-স্টেপ hunসহ Tsএবং এতে ফাংশনটি প্রসারিত করে vs।
বিঃদ্রঃ:
Tsএটি কোনও ধরণের নয় এবং vsএকটি মূল্য নয়! প্রকার / মানগুলির তালিকার জন্য এগুলি পৃথক নাম। হয় তালিকা সম্ভাব্য খালি হতে পারে। উভয়ই কেবল নির্দিষ্ট ক্রিয়া মেনে চলে। সুতরাং নিম্নলিখিতটি সম্ভব নয়:
typedef Ts MyList;
Ts var;
auto copy = vs;
সম্প্রসারণ লোকি
ফাংশন যুক্তি
template <typename... Ts>
void fun(Ts... vs)
প্রারম্ভিক তালিকা
any a[] = { vs... };
বেস নির্দিষ্টকারী
template <typename... Ts>
struct C : Ts... {};
template <typename... Ts>
struct D : Box<Ts>... { };
সদস্য আরম্ভকারী তালিকা
template <typename... Us>
D(Us... vs) : Box<Ts>(vs)... {}
মোক্ষম যুক্তি তালিকাগুলি
std::map<Ts...> m;
যুক্তিগুলির জন্য যদি কোনও সম্ভাব্য ম্যাচ থাকে তবে কেবল সংকলন করবে।
ক্যাপচার তালিকা
template <class... Ts> void fun(Ts... vs) {
auto g = [&vs...] { return gun(vs...); }
g();
}
গুণাবলী তালিকা
struct [[ Ts... ]] IAmFromTheFuture {};
এটি স্পেসিফিকেশনে রয়েছে, তবে কোনও বৈশিষ্ট্য নেই যা টাইপ হিসাবে প্রকাশ করা যেতে পারে, এখনও।
...তখন শনাক্তকারী পরিচয় করানোর আগে আসে। উভয় বা উভয় ধরণের প্যাকগুলি ব্যবহার...করার সময়, এক্সপ্রেশন প্যাটার্নটি প্রসারিত হওয়ার পরে আসে।