تمرير مؤشر إلى وظيفة عضو كوسيطة القالب. لماذا هذا العمل؟

StackOverflow https://stackoverflow.com/questions/1882740

سؤال

لدي بعض التعليمات البرمجية التي يعمل 100٪ في حالة الاستخدام لدي. أنا فقط أتساءل ما إذا كان يمكن لأي شخص أن يفسر كيف ولماذا يعمل.

لدي فصل قالب يجلس بين بعض الكود الذي يتعامل مع الخيوط واتصال الشبكة ومستخدم المكتبة لتمرير البيانات المستلمة من الخادم إلى المستخدم.

template <class Bar,
          class Baz,
          class BazReturnType,
          void (Bar::*BarSetterFunction)(const BazReturnType &),
          BazReturnType (Baz::*BazGetterFunction)(void) const>
class Foo
{
    Foo( Bar *bar )
        : m_bar(bar)
    {
    }

    void FooMemberFunction( const Baz *baz )
    {
        boost::bind( BarSetterFunction, m_bar,
                     boost::bind( BazGetterFunction, baz )() ) ();
    }

    Bar *m_bar;
};

تم إنشاء مثيل هذا القالب واستخدامه في المكتبة اعتمادا على أنواع البار والباز مثل ذلك:

typedef Foo<MyBar,
            MyBaz,
            ReturnTypeFromBazGetterFunction,
            &MyBar::ActualSetterFunction,
            &MyBaz::ActualGetterFunction >
    MyFoo;

MyBar *bar = new MyBar;
MyBaz *baz = new MyBaz;
MyFoo *f = new MyFoo( bar );
f->FooMemberFunction( baz );

هذه جميع الأعمال وتعزيز :: BIND يدعو وظائف Getter / Setter لتمرير البيانات حولها حيث يحتاج إلى الذهاب. كيف ولماذا يمر المؤشرات إلى وظائف الأعضاء كوسيطة القالب مثل في هذه الحالة العمل؟


استجابة للتعليقات، لم أدرك أن المؤشرات إلى وظائف الأعضاء كانت حجج قالب صالحة. إنه ليس شيئا رأيته "في البرية" من قبل. لقد جربت ذلك وعملت، لكنني لم أكن أتوقع ذلك.

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

المحلول

أعتقد أن هناك تفسيرا أفضل لماذا من الممكن القيام بذلك من "لأن المعيار يقول ذلك":

السبب في أنه يعمل هو أن مؤشرات إلى أعضاء هي قيم ثابتة معروفة في وقت الترجمة (مؤشر إلى عضو فعال إزاحة عضو من بداية الفصل). وبالتالي يمكن استخدامها كمعلمات من القوالب، تماما كما يمكن أن يكون أي ثابت عدد صحيح آخر.

من ناحية أخرى، فإن المؤشرات العادية لا تجميع ثوابت الوقت، لأنها تعتمد على تخطيط الذاكرة الموجودة في وقت التشغيل فقط. لا يمكن أن تكون حجج القالب.

نصائح أخرى

عندما تطرح سؤالا على طول خطوط "لماذا شيئا ما يعمل؟ " لماذا تجد أنها مفاجئة.

لماذا يعمل؟ لأن مواصفات اللغة تقول صراحة أنها تعمل. لا توجد إجابة أخرى، حتى تفسر مخاوفك بمزيد من التفاصيل.

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