Тип переключателя во время выполнения для списков типов как переключатель вместо вложенного, если? - PullRequest
2 голосов
/ 28 января 2010

Это из 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);
        }
      }
  };

Используется для переключения типов в TypeList. Вопрос в том, что они делают это через ряд вложенных if. Есть ли способ сделать этот тип переключения в качестве одного оператора выбора вместо этого?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 28 января 2010

Вам понадобится препроцессор для генерации большого switch. Вам понадобится get<>, чтобы запретить поиск вне пределов. Проверьте выходные данные компилятора, чтобы убедиться, что неиспользуемые случаи не дают результатов, если вам это нужно; при необходимости отрегулируйте; v).

Обратитесь к библиотеке препроцессора Boost, если вы хотите преуспеть в подобных вещах ...

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.
      }
  };
0 голосов
/ 28 января 2010

Вы всегда можете использовать бинарный поиск вместо линейного поиска. Было бы сложнее и с большей вероятностью иметь ошибки (бинарный поиск удивительно легко испортить).

Вы также можете вручную развернуть N type_switch::operator(), где N - это некоторая разумная верхняя граница числа длин списков типов, которые будут у вас в программе.

0 голосов
/ 28 января 2010

Я так не думаю.

Этот тип метапрограммирования шаблонов обычно выполняется с помощью рекурсии. Поскольку все это происходит во время компиляции, я не удивлюсь, если не будет рекурсии во время выполнения или проверки условий.

...