سؤال

إليك ما أريد أن أكون قادرًا على الكتابة:

class foo : public watchKeys<A, B, C> {}; //Or any list of keys

Boost :: MPL لديه تسلسل ، والتي تسمح لك بالقيام بذلك ، لكنني لا أريد القيام بذلك:

class foo : public watchKeys<mpl::list<A, B, C> > {};

لا مانع من أن تكون "قبيحًا" أو مطوّلة من الداخل ، لكني أريد أن تكون مفاتيح الساعات في نهاية المطاف بسيطة للغاية وبديهية. لا يمكنني أيضًا معرفة كيفية قيام Boost بذلك ، لكن يبدو أن هناك طبقة من وحدات الماكرو بيني وبين القوالب.

كيف يمكنني القيام بهذا؟ أنا أفضل ليس للقيام بالقائمة العملاقة للقوالب لكل عدد من الأنواع ، ولكن إذا كانت هذه هي الطريقة الوحيدة ...

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

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

المحلول

ال قائمة عملاقة من القوالب لكل عدد من الأنواع هي الطريقة الوحيدة للقيام بذلك في الإصدار الحالي من C ++. انظر Boost :: Tuple للحصول على مثال على كيفية القيام بذلك.

C ++ 0x يدعم القوالب المتنوعة, ، لكن هذا ليس مدعومًا جيدًا بعد (أعتقد أن الإصدار الحديث من GCC لديه دعم تجريبي).

نصائح أخرى

بدلاً من ذلك يمكنك القيام بذلك بشكل متكرر

template<typename Head, typename Tail>
struct list { };

struct emptylist { };

class foo : public watchKeys<list<A, 
                             list<B, 
                             list<C, emptylist> > > > { };

يمكنك بعد ذلك معالجته مثل هذا

template<typename List>
struct process;

template<typename Head, typename Tail>
struct process< list<Head, Tail> > : process<Tail> { 
  // process Head
};

template<>
struct process<emptylist> { };
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top