أنواع وقت التشغيل ستوش بالنسبة لضاعالة الطباعة كمحول بدلاً من متداخلة إذا كانت؟

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

  •  23-09-2019
  •  | 
  •  

سؤال

هذا من TTL:

////////////////////////////////////////////////////////////
//  run-time type switch
template <typename L, int N = 0, bool Stop=(N==length<L>::value) > struct type_switch;

template <typename L, int N, bool Stop>
  struct type_switch
  {
    template< typename F >
      void operator()( size_t i, F& f )
      {
        if( i == N )
        {
          f.operator()<typename impl::get<L,N>::type>();
        }
        else
        {
          type_switch<L, N+1> next;
          next(i, f);
        }
      }
  };

يتم استخدامه لتبطين الأنواع على طباعة. السؤال هو - إنهم يقومون بذلك عبر سلسلة من المتداخلين. هل هناك طريقة للقيام بمفتاح النوع هذا كبيان تحديد واحد بدلاً من ذلك؟

شكرًا!

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

المحلول

ستحتاج إلى المعالج المسبق لتوليد كبير switch. انك سوف تحتاج get<> إلى عدم وجود عمليات بحث خارجية. تحقق من إخراج المترجم للتأكد من عدم استخدام الحالات غير المستخدمة أي إخراج ، إذا كنت تهتم ؛ ضبط حسب الضرورة ؛ الخامس).

تحقق من مكتبة Boost Preprocessor إذا كنت تهتم بالتعرف على هذا النوع من الأشياء ...

template <typename L>
  struct type_switch
  {
    template< typename F >
      void operator()( size_t i, F& f )
      {
        switch ( i ) {
         #define CASE_N( N ) \
         case (N): return f.operator()<typename impl::get<L,N>::type>();
         CASE_N(0)
         CASE_N(1)
         CASE_N(2)
         CASE_N(3) // ad nauseam.
      }
  };

نصائح أخرى

أنا لا أعتقد ذلك.

هذا النوع من القالب metaprogramming يتم عادة مع عودة. نظرًا لأن كل شيء يحدث في وقت الترجمة ، فلن أتفاجأ إذا لم يكن هناك عودة وقت تشغيل أو اختبارات الحالة.

يمكنك دائمًا استخدام بحث ثنائي بدلاً من البحث الخطي. سيكون أكثر تعقيدًا ومن المرجح أن يكون لديه أخطاء فيه (من السهل بشكل مدهش البحث الثنائي).

يمكنك أيضًا التوسع يدويًا ن type_switch::operator(), ، حيث يكون N بعض الحد العلوي المعقول على عدد أطوال الطباعة التي ستحصل عليها في البرنامج.

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