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

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 الكامل بالعربي.