उस विषमता के प्रत्येक उदाहरण को एक नियमित एकल दीर्घवृत्त के मामले के साथ जोड़ा जाता है।
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes...)>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes......)>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes...) const>
{ typedef _Res result_type; };
template<typename _Res, typename... _ArgTypes>
struct _Weak_result_type_impl<_Res(_ArgTypes......) const>
{ typedef _Res result_type; };
मेरा अनुमान है कि डबल _ArgTypes..., ...
एलिप्सिस अर्थ के समान है , यानी सी-स्टाइल वैरिएग सूची के बाद एक वैरेडिक टेम्पलेट विस्तार।
यहाँ उस सिद्धांत का समर्थन करने वाला एक परीक्षण है ... मुझे लगता है कि हमारे पास सबसे खराब छद्म ऑपरेटर के लिए एक नया विजेता है।
संपादित करें: यह अनुरूप प्रतीत होता है। .8.3.5 / 3 पैरामीटर सूची को बनाने का एक तरीका बताता है
पैरामीटर-घोषणा-सूची ऑप्ट ... ऑप्ट
तो डबल-एलिप्सिस एक पैरामीटर-पैक के साथ समाप्त होने वाले पैरामीटर-डिक्लेरेशन-लिस्ट द्वारा बनता है, इसके बाद एक और एलिप्सिस होता है।
अल्पविराम विशुद्ध रूप से वैकल्पिक है; §8.3.5 / 4 कहता है
जहां वाक्यगत रूप से सही है और जहां "..." एक सार-घोषणाकर्ता का हिस्सा नहीं है, "..." ... "..." का पर्याय है।
यह है एक सार-declarator भीतर, [संपादित करें] लेकिन जोहानिस एक अच्छा मुद्दा यह है कि वे एक पैरामीटर-घोषणा के भीतर एक सार-declarator की बात कर रहे बनाता है। मुझे आश्चर्य है कि उन्होंने "पैरामीटर-घोषणा का हिस्सा" क्यों नहीं कहा, और यह वाक्य सिर्फ एक सूचनात्मक नोट क्यों नहीं है ...
इसके अलावा, va_begin()
में <cstdarg>
एक पैरामीटर की आवश्यकता से पहले सूची varargs, इसलिए प्रोटोटाइप f(...)
विशेष रूप से सी द्वारा अनुमति ++ बेकार है। C99 के साथ क्रॉस-रेफरेंसिंग, यह सादे सी में अवैध है। इसलिए, यह सबसे विचित्र है।
उपयोग नोट
अनुरोध के अनुसार, यहां डबल दीर्घवृत्त का प्रदर्शन है:
#include <cstdio>
#include <string>
template< typename T >
T const &printf_helper( T const &x )
{ return x; }
char const *printf_helper( std::string const &x )
{ return x.c_str(); }
template< typename ... Req, typename ... Given >
int wrap_printf( int (*fn)( Req... ... ), Given ... args ) {
return fn( printf_helper( args ) ... );
}
int main() {
wrap_printf( &std::printf, "Hello %s\n", std::string( "world!" ) );
wrap_printf( &std::fprintf, stderr, std::string( "Error %d" ), 5 );
}
...
बाद है...
।