0Pricing
C++ Academy · درس

القوالب متغيرة المعاملات وحزم المعاملات

استخدم حزم المعاملات وتعبيرات الطي لكتابة قوالب متغيرة المعاملات.

القوالب متغيرة المعاملات وحزم المعاملات درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

عدد متغير من معاملات القالب

تقبل القوالب متغيرة المعاملات أي عدد من معاملات القالب. وتُستخدم لكتابة دوال مثل std::make_unique وstd::tuple وتسجيل الأحداث بأسلوب printf.

صياغة حزمة المعاملات

استخدم typename... Ts للتصريح عن حزمة معاملات أنواع، واستخدم Ts... لتوسيعها.

template <typename... Args>
void print_all(Args... args) {
    // ...
}

توسيع الحزمة

توسّع ... الموجودة بعد تعبير الحزمة إلى قائمة مفصولة بفواصل.

template <typename... Args>
void pass_through(Args... args) {
    other_func(args...);    // pass each arg
}

القوالب متغيرة المعاملات التكرارية (الأسلوب القديم)

قبل C++17، كانت الدوال متغيرة المعاملات تُكتب عادةً بصورة تكرارية — تُعالج وسيطًا واحدًا، ثم تعيد الاستدعاء مع بقية الوسائط.

// base case
void log() {}

// recursive case
template <typename T, typename... Rest>
void log(T first, Rest... rest) {
    std::cout << first;
    log(rest...);
}

تعبيرات الطي (C++17)

أضاف C++17 تعبيرات الطي، وهي أوضح بكثير من التكرار. طبّق عاملًا على حزمة.

template <typename... Args>
auto sum(Args... args) {
    return (args + ...);    // fold +
}

std::cout << sum(1, 2, 3, 4);   // 10

عوامل الطي

أربعة أشكال للطي:

  • (... op pack) — طي يساري عبر توسعة أحادية
  • (pack op ...) — طي يميني
  • (init op ... op pack) — طي يساري مع قيمة ابتدائية
  • (pack op ... op init) — طي يميني مع قيمة ابتدائية

طباعة جميع الوسائط

صيغة شائعة باستخدام الطي بالفاصلة.

template <typename... Args>
void print_all(Args... args) {
    ((std::cout << args << " "), ...);   // comma fold
}

print_all(1, "hi", 3.14);   // 1 hi 3.14

عدّ الوسائط

تعيد sizeof...(pack) عدد العناصر في الحزمة وقت الترجمة.

template <typename... Args>
void info(Args... args) {
    std::cout << "count = " << sizeof...(args);
}

قوالب الأصناف متغيرة المعاملات

يمكن أن تحتوي قوالب الأصناف أيضًا على حزم معاملات. مثال: std::tuple<Ts...>.

template <typename... Ts>
class Tuple {
    // implementation uses recursion or storage tricks
};

التمرير المثالي مع الحزم

اجمع بين القوالب متغيرة المعاملات وstd::forward لتمرير الوسائط العشوائية بصورة مثالية إلى باني.

template <typename T, typename... Args>
std::unique_ptr<T> my_make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

معالجة حزم الأنواع

باستخدام تخصيص القوالب أو تعبيرات الطي، يمكنك تنفيذ عمليات على القوائم وقت الترجمة، مثل العنصر الأول والأخير، وتحليل الرأس والذيل.

المزالق

المشكلات الشائعة:

  • نسيان توسيع الحزمة (args مقابل args...)
  • ترتيب التقييم في تعبيرات الطي (يفرق الطي اليساري عن اليميني مع العوامل غير التجميعية)
  • زيادة وقت الترجمة بسبب التكرار العميق

تحقق سريع

ما ميزة C++17 التي تبسّط جمع جميع عناصر حزمة المعاملات؟

ملخص

تتعامل القوالب متغيرة المعاملات مع عدد متغير من معاملات القالب عبر حزم المعاملات. وتستبدل تعبيرات الطي في C++17 الشيفرة التكرارية متغيرة المعاملات بتعبيرات موجزة. وبالاقتران مع التمرير المثالي، تُستخدم هذه الميزات لبناء دوال المُنشئ والتوزيع العام.

الأسئلة الشائعة

هل درس «القوالب متغيرة المعاملات وحزم المعاملات» مجاني؟

نعم — نص درس «القوالب متغيرة المعاملات وحزم المعاملات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «القوالب متغيرة المعاملات وحزم المعاملات»؟

استخدم حزم المعاملات وتعبيرات الطي لكتابة قوالب متغيرة المعاملات. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «القوالب متغيرة المعاملات وحزم المعاملات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مراجعة قوالب الدوال والأصناف
  2. تخصيص القوالب الجزئي والكامل
  3. القوالب متغيرة المعاملات وحزم المعاملات
  4. دوال constexpr وif constexpr
← العودة إلى C++ Academy