অদ্ভুততার প্রতিটি উদাহরণ নিয়মিত একক উপবৃত্তির কেসের সাথে জুড়ে দেওয়া হয়।
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 প্যারামিটার তালিকাটি তৈরি করার একটি উপায় বর্ণনা করে
প্যারামিটার-ঘোষণা-তালিকা opt ... অপ্ট
সুতরাং ডাবল-উপবৃত্ত একটি প্যারামিটার-ডিক্লেয়ারেশন-তালিকা দ্বারা গঠিত হয় যা প্যারামিটার প্যাকের সাথে সমাপ্ত হয় এবং তার পরে অন্য উপবৃত্তাকার হয়।
কমা খাঁটি optionচ্ছিক; §8.3.5 / 4 বলে
যেখানে সিনথেটিকভাবে সঠিক এবং যেখানে "..." কোনও বিমূর্ত-ঘোষণাকারীর অংশ নয়, ", ..." "..." এর সমার্থক শব্দ।
এই হল একটি বিমূর্ত-declarator মধ্যে [সম্পাদনা] কিন্তু জোহানেস একটি ভাল পয়েন্ট যে তারা একটি পরামিতির-ঘোষণা মধ্যে একটি বিমূর্ত-declarator উল্লেখ করা হয় তোলে। আমি অবাক হয়েছি কেন তারা "প্যারামিটার-ঘোষণার অংশ" বলেন নি এবং কেন এই বাক্যটি কেবল একটি তথ্যমূলক নোট নয় ...
তদ্ব্যতীত, va_begin()
মধ্যে <cstdarg>
একটি প্যারামিটার প্রয়োজন সামনে তালিকা ভারার্গস, তাই প্রোটোটাইপ f(...)
বিশেষভাবে C দ্বারা মঞ্জুরিপ্রাপ্ত ++, অনর্থক। সি 99 এর সাথে ক্রস-রেফারেন্সিং এটি প্লেইন সি-তে অবৈধ So তাই, এটি সবচেয়ে উদ্ভট।
ব্যবহার নোট
অনুরোধ করে, এখানে ডাবল উপবৃত্তের একটি প্রদর্শন রয়েছে:
#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 );
}
...
অনুসরণ করা হয়...
।