वैरेडिक टेम्प्लेट के संदर्भ में, इलिप्सिस ...
का उपयोग टेम्प्लेट पैरामीटर पैक को अनपैक करने के लिए किया जाता है यदि यह किसी अभिव्यक्ति के दाईं ओर दिखाई देता है ( एक पल के लिए इस अभिव्यक्ति पैटर्न को कॉल करें )। नियम यह है कि जो भी पैटर्न बाईं ओर है ...
उसे दोहराया जाता है - अनपैक्ड पैटर्न (उन्हें अब अभिव्यक्ति कहते हैं) को अल्पविराम द्वारा अलग किया जाता है ,
।
इसे कुछ उदाहरणों से सबसे अच्छा समझा जा सकता है। मान लें कि आपके पास यह फ़ंक्शन टेम्प्लेट है:
template<typename ...T>
void f(T ... args)
{
g( args... ); //pattern = args
h( x(args)... ); //pattern = x(args)
m( y(args...) ); //pattern = args (as argument to y())
n( z<T>(args)... ); //pattern = z<T>(args)
}
अब अगर मैं गुजर इस समारोह फोन T
के रूप में {int, char, short}
, तो समारोह कॉल में से प्रत्येक के रूप में विस्तारित किया जाता है:
g( arg0, arg1, arg2 );
h( x(arg0), x(arg1), x(arg2) );
m( y(arg0, arg1, arg2) );
n( z<int>(arg0), z<char>(arg1), z<short>(arg2) );
आपके द्वारा पोस्ट किए गए कोड में, फ़ंक्शन कॉल std::forward
द्वारा सचित्र चौथे पैटर्न का अनुसरण करता है n()
।
ऊपर x(args)...
और y(args...)
ऊपर का अंतर नोट करें !
आप ...
सरणी को इनिशियलाइज़ करने के लिए निम्नानुसार भी उपयोग कर सकते हैं :
struct data_info
{
boost::any data;
std::size_t type_size;
};
std::vector<data_info> v{{args, sizeof(T)}...}; //pattern = {args, sizeof(T)}
इसका विस्तार किया गया है:
std::vector<data_info> v
{
{arg0, sizeof(int)},
{arg1, sizeof(char)},
{arg2, sizeof(short)}
};
मैंने अभी महसूस किया कि एक पैटर्न भी शामिल हो सकता है जैसे कि एक्सेस स्पेसियर, जैसे public
कि निम्नलिखित उदाहरण में दिखाया गया है:
template<typename ... Mixins>
struct mixture : public Mixins ... //pattern = public Mixins
{
//code
};
इस उदाहरण में, पैटर्न का विस्तार इस प्रकार है:
struct mixture__instantiated : public Mixin0, public Mixin1, .. public MixinN
अर्थात्, सभी आधार वर्गों से सार्वजनिक रूप से mixture
प्राप्त होता है ।
उम्मीद है की वो मदद करदे।
...
तो पहचानकर्ता को पेश किए जाने से पहले आता है। या तो या दोनों प्रकार के पैक का उपयोग करते समय,...
अभिव्यक्ति पैटर्न के विस्तार के बाद आता है।