"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكننا تكرار قائمة حجج القالب المتنوع بإيجاز؟

كيف يمكننا تكرار قائمة حجج القالب المتنوع بإيجاز؟

تم النشر بتاريخ 2024-11-04
تصفح:396

How Can We Iterate Over a Packed Variadic Template Argument List Concisely?

كيفية التكرار على قائمة وسيطات قالب متغير معبأة

في لغة 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;

    } (), ...);
}

توفر هذه الطريقة آلية تكرار أكثر إيجازًا ووضوحًا.

بدائل للتعامل مع فواصل الحلقات

بينما ينجز الحل المذكور أعلاه المهمة، يفتقر إلى القدرة على تنفيذ الفواصل أو الإرجاعات داخل الحلقة. لمعالجة هذه المشكلة، يمكننا استخدام حلول بديلة مثل:

  • استخدام محاولة/رمي: في هذا الأسلوب، يمكننا طرح استثناءات داخل لامدا للخروج من الحلقة. ومع ذلك، يمكن أن تؤثر هذه الطريقة بشكل كبير على الأداء بسبب عبء الاستثناءات.
  • متغير/مفاتيح if: يتضمن هذا الأسلوب إنشاء متغير للتحكم في الحلقة واستخدام عبارات if للخروج من الحلقة. على الرغم من فعاليته، إلا أنه يمكن أن يؤدي إلى تعليمات برمجية أقل جمالية.
بيان الافراج أعيد طبع هذه المقالة على: 1729667291 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3