سؤال

ولدي فئة يستخدم [فونكتورس] وحدات العمل. أنه يقبل إشارة إلى functor في منهجه تشغيل (). للسماح هذه الفئة لتعمل على أي functor، يجب على جميع هذه [فونكتورس] تستمد من وجهة نظري قاعدة الطبقة functor الذي يبدو مثل هذا:

class baseFunctor{

public:
    virtual void operator()()=0;
    virtual baseFunctor Clone()=0;
};

وهذا يعمل، ولكن من الواضح أنه يقيد تلك [فونكتورس] إلى وجود طريقة المشغل أن يعود باطلة ويقبل أية معلمات. أنا بحاجة إلى أن تكون قادرة على قبول functor في صفي التي يمكن أن تتخذ أي نوع من المعلمات والعودة أي شيء. على ما يبدو في القيام، وقادر على لكنني لا يمكن أن يبدو لايجاد وسيلة للقيام بذلك. لقد نظرت باستخدام القوالب، وراثة متعددة، ولكن الحصول على الاحتفاظ أحبطت من حقيقة أن الطبقة التي تحتاج لتشغيل هذا functor يجب أن تكون قادرة على قبول أي نوع، لذلك سوف تقبل نوع الفئة الأساسية، وهكذا لن تعرف نوع الفعلي من functor.

وأي اقتراحات ما السبيل للنظر في أن يكون موضع تقدير.

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

المحلول

وكيف سيتم الفئة التي تدعو functor معرفة ما المعلمات لتوفير وماذا تفعل مع قيمة الإرجاع، إن وجدت؟

نصائح أخرى

وهكذا، إذا أنا أقرأ هذا الحق، لديك "نمط الزوار". قد يكون أمرا جيدا بالنسبة لك للبحث عن.

شخص يحتاج إلى معرفة ما اكتب functor هو أن تعطيه الحجج. في كثير من الأحيان مع [فونكتورس]، يتم تعيين الحجج لمجالات فئة مشتقة، والمشغل () ستعمل على تلك الحقول. وهذا يعني أن طريقة غبية الذي يستدعي functor ولا يعرف شيئا عن حصولها على إغلاق (طريقة بالإضافة إلى الحجج كلها في فئة واحدة) من قبل شخص أكثر دراية.

إذا كنت لا تريد [فونكتورس] العامة التي تتخذ حجج متعددة في المشغل ()، والنموذجيه تحصل اقعة في المنتصف هناك، ولكن عليك واحد لكل arity.

وأنا أتفق مع نيل. الطبقة الرئيسية لديه لمعرفة ما المعلمات لتمرير وما قيمة الإرجاع إلى تتوقع من هذه [فونكتورس]. يمكنك فقط اكتب يلقي بك "functor" لفئة المناسبة التي تدعم وظيفة مع الحجج اللازمة وقيمة المقابل؟

class baseFunctor
{
};

class functor1x2: public baseFunctor
{
public:
    virtual void* execute(void*, void*);

}

class MainClass
{
public:
   void Execute(baseFunctor* ipFunctor)
   {
      functor1x2* lpFunctor1x2 = dynamic_cast<functor1x2*>(ipFunctor);
      if(lpFunctor1x2)
      {
         lpFunctor1x2->execute(NULL, NULL);
      }
   }
}

ولست متأكدا ما يمكن إنجازه مع هذا النهج الذي لا يمكن بسهولة أن يتحقق مع نمط الزوار، كما لوحظ درو.

إذا كنت مفتوحة لاستخدام المكتبة دفعة (www.boost.org)، قد تجد Boot.Bind وBoost.Function ذات أهمية خاصة. لقد استخدمتها في الماضي لتحقيق شيء كبير جدا على غرار ما نناقشه.

إذا كنت تستخدم Boost.Bind، يمكنك تنفيذ التمشيط على [فونكتورس] إلى مراعاة الفروق بين عدد من الحجج يتوقع functor وعدد من الحجج يتوقع طريقة تشغيل (أي صفر). ان الرمز الذي يخلق functor أن ربط أي حجج لقيم معينة، وبالتالي خلق functor صفر الحجة التي يمكن أن تنتقل إلى تشغيل ().

وMV

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

إذا كنت تخطط لاستخدام الميراث، لا تبدو حتى أنواع التغاير العودة (وفي الظاهري منشئ لغة ).

والآن، لحوم المشكلة: المشكلة هي في الحقيقة ليست مع مرور في functor ولكن مع تطبيق functor. قد تحتاج إلى إلقاء نظرة على boost::lambda و boost::parameter كذلك.

وأعتقد أنك تريد حجة القطع، مثل varargs لC ++.

وربما الأمراض المنقولة جنسيا :: :: TR1 وظيفة مثيرة للاهتمام بالنسبة لك؟

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