سؤال

المثال أولا:

template <class HashingSolution> 
struct State : public HashingSolution {

  void Update(int idx, int val) {
    UpdateHash(idx, val);
  }

  int GetState(int idx) {
    return ...;
  }
};

struct DummyHashingSolution {
  void UpdateHash(int idx, int val) {}
  void RecalcHash() {}
};

struct MyHashingSolution {
  void UpdateHash(int idx, int val) {
    ...
  }

  void RecalcHash() {
    ...
    UpdateHash(idx, GetState(idx)); // Problem: no acces to GetState function, can't do recursive application of templates
    ...
  }
};

في هذا المثال، يمكنني تمرير MyHashingSolution إلى فئة الحالة حتى تتمكن الحالة من الوصول إلى أساليب HashingSolution، لكن لا يمكن لـ HashingSolution استدعاء GetState.هل من الممكن العمل حول هذا؟

هذا في أعمق حلقة.الوظيفة الافتراضية هنا تقلل الأداء بأكثر من 25%.التضمين أمر بالغ الأهمية بالنسبة لي.

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

المحلول

كما يقترح jalf في التعليقات، ربما تريد استخدام متغير من نمط القالب المتكرر الغريب (كرتب).وهذا هو، جعل MyHashingSolution قالب فئة محدد بواسطة الفئة المشتقة:

template <typename D>
struct MyHashingSolution {
    typedef D Derived;

    void UpdateHash(int idx, int val) {
        ...
    }

    void RecalcHash() {
        ...
        UpdateHash(idx, derived().GetState(idx));
        ...
    }

private:
    // Just for convenience
    Derived& derived() { return *static_cast<Derived*>(this); }
};

في هذه الحالة، لأنك تريد المشتقة State لكي تكون الطبقة أيضًا نموذجًا، عليك اتخاذ خطوة غير معتادة بعض الشيء وهي الإعلان State كقالب فئة يأخذ معلمة قالب القالب:

template <template <class T> class HashingSolution>
struct State : public HashingSolution<State<HashingSolution> > {
typedef HashingSolution<State<HashingSolution> > Parent;

    void Update(int idx, int val) {
        Parent::UpdateHash(idx, val);   // g++ requires "Parent::"
    }

    int GetState(int idx) {
        return ...;
    }
};

النقطة الأساسية هي أنه بشرط State يرث من HashingSolution<State<HashingSolution> >, Derived هي فئة مشتقة من HashingSolution<State<HashingSolution> > لذلك static_cast<Derived*>(this) مكتئب في HashingSolution<State>::derived() يجمع ويعمل بشكل صحيح.(إذا أخطأت واشتقت State من HashingSolution<SomeOtherType> بدلاً من ذلك، ثم جرّب شيئًا يتضمن الاتصال بـ derived(), ، سوف يشكو المترجم من متطلبات static_cast<> لم تتحقق.)

ثم أعلن ملموسة State الفئة التي تريد استخدامها مثل ذلك:

typedef State<MyHashingSolution> MyState;

لسوء الحظ، هذا الحل له آثار جانبية ستحتاج إلى تغييرها DummyHashingSolution (وأي أنواع أخرى من هذا القبيل) إلى القوالب التي تتجاهل وسيطة القالب الواحد الخاصة بها، وذلك لجعلها قابلة للاستخدام كوسيطات قالب القالب.

نصائح أخرى

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

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

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