سؤال

وهنا السيناريو: كنت ترغب في الحصول على الدرجة المضيف الذي يمكن أن يكون لها عدد متغير من mixins (ليس من الصعب جدا مع قوالب variadic - انظر على سبيل المثال <لأ href = "HTTP: //citeseerx.ist.psu ايدو / viewdoc / ملخص؟ دوي = 10.1.1.103.144 "يختلط =" noreferrer "> http://citeseerx.ist.psu.edu/viewdoc/summary؟doi=10.1.1.103.144 ). ومع ذلك، فما استقاموا لكم فاستقيموا أيضا مثل mixins إلى أن معلمات من قبل الطبقة المضيف، حتى يتمكنوا من الرجوع إلى أنواع العامة لها (باستخدام لغة CRTP). المشكلة تنشأ عندما تحاول خلط الاثنين - بناء الجملة الصحيح غير واضح بالنسبة لي. على سبيل المثال، فشل التعليمة البرمجية التالية إلى ترجمة مع ز ++ 4.4.1:

template <template<class> class... Mixins>
class Host : public Mixins<Host<Mixins>>... {
  public:
    template <class... Args>
    Host(Args&&... args) : Mixins<Host>(std::forward<Args>(args))... {}
};

template <class Host> struct Mix1 {};

template <class Host> struct Mix2 {};

typedef Host<Mix1, Mix2> TopHost;
TopHost *th = new TopHost(Mix1<TopHost>(), Mix2<TopHost>());

مع الخطأ:

tst.cpp: In constructor ‘Host<Mixins>::Host(Args&& ...) [with Args = Mix1<Host<Mix1, Mix2> >, Mix2<Host<Mix1, Mix2> >, Mixins = Mix1, Mix2]’:

tst.cpp:33:   instantiated from here

tst.cpp:18: error: type ‘Mix1<Host<Mix1, Mix2> >’ is not a direct base of ‘Host<Mix1, Mix2>’

tst.cpp:18: error: type ‘Mix2<Host<Mix1, Mix2> >’ is not a direct base of ‘Host<Mix1, Mix2>’

هل لديها تجربة ناجحة خلط قوالب variadic مع CRTP؟

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

المحلول

وفيما يلي يبدو أن العمل. وأضاف لي Mixins... في الطبقات mixin الموروثة الذي يوسع inplace حزمة المعلمة. خارج الجسم من القالب Host، جميع المعلمات قالب Host يجب تحديد ذلك يخدم Mixins... هذا الغرض. داخل الجسم، Host فقط غير كافية ولا حاجة لتوضيح كافة المعلمات القالب. نوع من ناحية قصيرة.

#include <utility>

template <template<class> class... Mixins>
class Host : public Mixins<Host<Mixins...>>...
{
  public:
    Host(Mixins<Host>&&... args) : Mixins<Host>(std::forward<Mixins<Host>>(args))... {}
};

template <class Host> struct Mix1 {};
template <class Host> struct Mix2 {};

int main (void)
{
  typedef Host<Mix1, Mix2> TopHost;
  delete new TopHost(Mix1<TopHost>(), Mix2<TopHost>());
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top