operator[] متعدد الأبعاد
operator[] بعدّة معاملات operator[] متعدد الأبعاد
C++23 يسمح لـ operator[] بقبول أكثر من معامل داخل نفس الأقواس المربّعة، فتصير صيغة matrix[i, j] وصولًا حقيقيًا متعدد الأبعاد بدل عامل الفاصلة.
قبل C++23، operator[] يقبل معاملًا واحدًا فقط بالضبط — كتابة matrix[i, j] كانت تُفسَّر عبر عامل الفاصلة (comma operator) فتؤول لقيمة j فقط، وهو سلوك مفاجئ لمن يأتي من لغات مثل بايثون أو NumPy حيث [i, j] وصول طبيعي متعدد الأبعاد. اقتراح المعيار P2128 يسمح لـ operator[] بقبول عدّة معاملات (بما فيها صفر أو معاملات متغيّرة العدد)، فيصير matrix[i, j] استدعاءً فعليًا لـ operator[](i, j) بدل عامل الفاصلة.
الصياغة
ReturnType& operator[](IndexType i, IndexType j) { ... }📄 مثال
#include <vector>
class Matrix {
std::vector<double> data;
std::size_t cols;
public:
Matrix(std::size_t rows, std::size_t cols) : data(rows * cols), cols(cols) {}
double& operator[](std::size_t row, std::size_t col) {
return data[row * cols + col];
}
};
Matrix m(3, 3);
m[1, 2] = 5.0; // وصول طبيعي بمعاملينأهم النقاط
| العنصر | الوظيفة |
|---|---|
| عدّة معاملات | operator[] يقبل الآن أكثر من معامل واحد داخل نفس الأقواس |
| P2128 | اقتراح المعيار الرسمي الذي أضاف هذه الميزة في C++23 |
| مصفوفات علمية | يقرّب صياغة C++ من NumPy وMATLAB وFortran بالوصول متعدد الأبعاد |
💡 نصائح عملية
- مفيد خصوصًا بأصناف المصفوفات ثنائية/ثلاثية الأبعاد المكتوبة يدويًا (بدون مكتبة خارجية)
- لا يغيّر سلوك عامل الفاصلة خارج سياق [] — التغيير مقصور على صيغة E1[E2, E3, ...] تحديدًا
⚠️ أخطاء شائعة
- الخلط بين matrix[1, 2] بمعناه الجديد (معاملان لـ operator[]) ومعناه القديم (عامل الفاصلة) عند قراءة كود مكتوب بمعيار أقدم
- الاعتماد عليه بمترجم لا يدعم C++23 كاملًا — دعمه أحدث نسبيًا حتى بين مزايا C++23
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.