معنی این کد merge با variadic template ؟! - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

معنی این کد merge با variadic template ؟!

+1 امتیاز

این کد که داخل این پست هست  یعنی چی ؟

template< typename ... Args >
std::string make_path(const std::string& seperator, Args const& ... args)
{
    std::ostringstream stream;
    using List = int[];
    (void)List{ 0, ((void)(stream << args << seperator), 0) ... };
    return stream.str();
}

معنی 

 (void)List{ 0, ((void)(stream << args << seperator), 0) ... };

چیه ؟

سوال شده مرداد 27, 1393  بوسیله ی Xavi (امتیاز 627)   24 83 110
دوباره تگ گذاری شد مرداد 27, 1393 بوسیله ی BlueBlade

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

اون خطی که گفتید برای unpack کردن variadic template استفاده میشه 

شما در حالت معمولی برای این که به مقدار های داخل variadic templateدسترسی داشته باشید باید چند تا تابع بنویسید و بصورت بازگشتی ازشون استفاده کنید 

مثلا این جا

با توجه به using قبل از خطی که هست اون کد معادله اینه :

(void)int[]{ 0, ((void)(stream << args << seperator), 0) ... };

 خروجی stream<<args<<seprator از نوع ostream& هست 

 یعنی کد معادل این میشه :

(void)int[]{ 0, ((void)(ostream&, 0) ... };

پس ما الان صرفا داریم یک آرایه رو با initializer list مقدار میدیم

2 تا void ّبرای این گزاشته شدن که کامپایلر راحت تر این کد رو optimize کنه و آرایه رو حذف کنه پس کد معادل این میشه

int[]{ 0, (ostream&, 0) ... };

عبارت (ostream&, 0) همیشه مقدار 0 رو برمیگردونه .(عملگر , )

پس در مجموع کدی که میمونه  فقط یک آرایه معمولی با اعضای 0  میسازه .

int[]{ 0, 0 };

 

پاسخ داده شده مرداد 27, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد مرداد 28, 1393 بوسیله ی Xavi
...