تخطَّ إلى المحتوى

std::tuple

التجميع بعدة أنواع std::tuple

std::tuple يحمل أي عدد من القيم بأي أنواع معًا — تعميم لفكرة pair، ومفيد خصوصًا لإرجاع أكثر من قيمة من دالة واحدة دون تعريف صنف مخصّص.

pair يحمل قيمتين فقط بنوعين ثابتين، بينما tuple يعمم الفكرة لأي عدد من الأنواع المختلفة. الوصول للعناصر يكون بالفهرس عبر std::get<index>(t) وقت الترجمة، أو — الأوضح عمليًا — بدمجه مع الربط المُهيكل. مفيد لحالات سريعة أو مؤقتة؛ لو القيم لها معنى مستقر وستُستخدم بعدّة أماكن بالكود، struct مخصّص بأسماء أعضاء واضحة أفضل قابلية للقراءة على المدى الطويل.

الصياغة

std::tuple<Type1, Type2, ...> name(value1, value2, ...);
auto t = std::make_tuple(value1, value2, ...); // استنتاج تلقائي للأنواع

📄 مثال

#include <tuple>

std::tuple<std::string, int, double> makeRecord() {
    return {"منتج", 42, 19.99};
}

auto record = makeRecord();
std::cout << std::get<0>(record); // "منتج" بالفهرس

auto [name, quantity, price] = makeRecord(); // الأوضح: ربط مُهيكل مباشرة

أهم النقاط

العنصرالوظيفة
std::get<index>(t)الوصول بفهرس ثابت معروف وقت الترجمة — يبدأ من 0
std::make_tuple(...)ينشئ tuple ويستنتج الأنواع تلقائيًا دون كتابتها صراحة
std::tie(a, b, ...)يفكّك tuple لمتغيّرات موجودة مسبقًا (بدل إعلان جديد بالربط المُهيكل)

💡 نصائح عملية

  • لإرجاع عدّة قيم من دالة، دمج tuple مع الربط المُهيكل بالجهة المستقبِلة أوضح بكثير من التعامل مع std::get مباشرة
  • لو القيم بمعنى ثابت وستُستخدم بأكثر من دالة، فضّل struct مخصّص — أسماء الأعضاء أوضح من فهارس tuple

⚠️ أخطاء شائعة

  • استخدام std::get بفهرس خارج حدود tuple — خطأ ترجمة لأن حجمه معروف وقت الترجمة، وليس خطأ وقت تشغيل
  • تكديس عدد كبير من القيم غير المترابطة بـ tuple واحد بدل struct — يفقد الكود وضوح الأسماء ويصعّب الصيانة لاحقًا

خصائص ذات صلة

🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.