كيفية التكرار على قائمة وسيطات قالب متغير معبأة
في لغة C، يشكل التكرار عبر قائمة وسائط قالب متغير معبأة تحديًا بسبب عدم القدرة على معرفة عدد الوسائط واسترجاع البيانات منها بشكل فردي. تتفاقم هذه المشكلة بشكل أكبر من خلال استخدام ماكرو في إنشاء الوظيفة، مما يمنع الاستدعاءات المتكررة.
لمعالجة هذه المشكلة، يستخدم الحل المقدم نوعًا مخصصًا، أي، يمكنه الاحتفاظ بأنواع مختلفة من البيانات. من خلال تمرير هذا النوع إلى قالب متغير، يتم توسيع الوسائط إلى متجه لأي كائنات. بعد ذلك، يمكن استرجاع العناصر الفردية لهذا المتجه باستخدام وظائف getter المتخصصة (get
بينما تنجز هذه الطريقة المهمة، إلا أنها تتطلب استدعاءات الدوال المطولة، مثل foo(arg(1000)). لتبسيط ذلك، نسعى إلى طريقة تكرار أكثر إيجازًا أو ما يعادل std::get() لقوائم وسيطات القوالب المتغيرة المعبأة.
الحل باستخدام تعبيرات STL Fold وLambda
بالنسبة إلى الإصدار C 17 والإصدارات الأحدث، يمكن استخدام تعبيرات الطية جنبًا إلى جنب مع دالة lambda لتحقيق التكرار. يمكن لـ lambda تنفيذ عمليات عشوائية داخل الحلقة، بما في ذلك زيادة العداد وطباعة الوسيطة الحالية:
template
void Foo (Ts && ... inputs)
{
int i = 0;
([&]
{
// Do things in your "loop" lambda
i;
std::cout << "input " << i << " = " << inputs << std::endl;
} (), ...);
}
توفر هذه الطريقة آلية تكرار أكثر إيجازًا ووضوحًا.
بدائل للتعامل مع فواصل الحلقات
بينما ينجز الحل المذكور أعلاه المهمة، يفتقر إلى القدرة على تنفيذ الفواصل أو الإرجاعات داخل الحلقة. لمعالجة هذه المشكلة، يمكننا استخدام حلول بديلة مثل:
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3