سؤال

ما هي الخيارات المختلفة لتنفيذ بناء مؤشر إلى عضو في C++/CLI؟

لقد قمت بتنفيذ بعض خوارزميات الهندسة ثنائية الأبعاد التي تنفذ بعض الإجراءات بناءً على إحداثيات X وY.أجد أنني كثيرًا ما أقوم بتكرار الكود مرة واحدة للمحور X ومرة ​​للمحور Y.مثال على ذلك هو إيجاد الحدود القصوى والدنيا على طول كل محور.

لو كنت أستخدم لغة C++ الأصلية، لكان بإمكاني استخدام مؤشر للعضو X أو Y (أيضًا العرض والارتفاع وما إلى ذلك) وتمريره كمعلمة بحيث أحتاج إلى تنفيذ كل خوارزمية مرة واحدة فقط.ولكن مع C++/CLI، هذا غير ممكن.ما هي خياراتي؟أنا أبحث عن شيء فعال وخفيف الوزن ومقتضب.

هل كانت مفيدة؟

المحلول

سأجعل الوسيطة وسيطة نوع القالب بدلاً من ذلك، وأستخدم الوظائف التي تقوم بتغليف الوصول إلى الخاصية.على سبيل المثال:

ref class Point {
     property int X;
     property int Y;
};

struct Point_X_accessor
{
     static int get(Point^ p) { return p->X; }
     static int set(Point^ p, int value) { p->X = value; }
};

struct Point_Y_accessor
{
     static int get(Point^ p) { return p->Y; }
     static int set(Point^ p, int value) { p->Y = value; }
};

template <class PointAccessor>
int some_algorithm(Point^ p) { ... }

some_algorithm<Point_X_accessor>(p);
some_algorithm<Point_Y_accessor>(p);

بالطبع، يكون هذا منطقيًا فقط إذا كان لديك ما يكفي من الخوارزميات الطويلة بما يكفي لتبرير كل النموذج المعياري.على الرغم من أنه يمكن إنشاء الأغلفة والإشارة إليها عبر ماكرو، إلا أنه من الممكن تقليل عدد أسطر التعليمات البرمجية قليلًا.

نصائح أخرى

الخيار 1:إذا تم عرض X وY كأعضاء عامين، فيمكنك تعريفهم كجزء من اتحاد مجهول، على سبيل المثال:

class Shape {
public:
    union {
        struct { double X; double Y; };
        double point[2];
    };
    ...
};

يتيح لك هذا الوصول إلى X كشكل.X أو Shape.point[0]، وبالمثل، Shape.Y كشكل.نقطة[1].

الخيار 2:إذا تم عرض X وY كخصائص، فيمكنك جعل الحروف/المحددات الخاصة بهم تصل إلى مصفوفة عضو مكونة من عنصرين، ثم تعرض المصفوفة كخاصية للقراءة فقط أيضًا.على الرغم من أن المتصل لا يمكنه تعديل خاصية المصفوفة، إلا أنه لا يزال بإمكانه تعديل عناصرها.

الخيار 3:حسنا، ليس خيارا، حقا.لا تستخدم انعكاس .NET للوصول إلى الخصائص بالاسم.تكلفة وقت التشغيل مرتفعة للغاية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top