deducing this
deducing this: توحيد نسخ الدالة العضو deducing this
C++23 يسمح بتصريح معامل الكائن (this) صراحة كأوّل معامل بدالة عضو، فتُستنتَج كل حالات const/& / && تلقائيًا بنسخة واحدة بدل تكرارها.
تقليديًّا، لو أردت دالة عضو تتصرّف بشكل مختلف حسب كون الكائن const أو غير const، أو lvalue أو rvalue، تحتاج كتابة نسخة منفصلة لكل تأهيل (qualifier) — تكرار كبير للمنطق نفسه. C++23 (اقتراح P0847) يسمح بتصريح معامل الكائن الضمني (this) صراحة كأوّل معامل، عادة باسم self، ويُستنتج نوعه (بما فيه const/& / &&) تلقائيًا عبر قالب (template) — فتكتب نسخة عامّة واحدة تغطّي كل الحالات.
الفائدة العملية الأبرز: تبسيط أنماط مثل CRTP (Curiously Recurring Template Pattern)، وتوحيد getters/setters بلا تكرار نسخة لكل تأهيل.
الصياغة
template <typename Self>
auto&& method(this Self&& self, ...) { ... }📄 مثال
struct Wrapper {
int value;
template <typename Self>
auto&& getValue(this Self&& self) {
return std::forward<Self>(self).value;
}
};أهم النقاط
| العنصر | الوظيفة |
|---|---|
| this Self&& self | معامل الكائن الصريح — يجب أن يكون أوّل معامل بالدالة |
| استنتاج تلقائي | نوع Self (const/& / &&) يُستنتَج حسب طريقة استدعاء الدالة |
| P0847R7 | اقتراح المعيار الرسمي الذي أضاف هذه الميزة في C++23 |
💡 نصائح عملية
- استخدمها لتوحيد نسخ متعددة من نفس الدالة العضو كانت تُكتب سابقًا لكل تأهيل على حدة
- مفيدة خصوصًا لتبسيط CRTP دون الحاجة لقالب صنف أساس منفصل
⚠️ أخطاء شائعة
- نسيان أن معامل this الصريح يجب أن يكون أوّل معامل بقائمة المعاملات
- استخدامها بمترجم لا يدعم هذه الميزة من C++23 كاملًا دون التحقق أولًا
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.