TIPO DO TIPO DE RUNDO PARA O TESTELISTA como um interruptor em vez de um IF de aninhado?

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

  •  23-09-2019
  •  | 
  •  

Pergunta

Isto é de 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);
        }
      }
  };

É usado para a matéria de digitação em uma lista de digitação. A pergunta é: eles estão fazendo isso através de uma série de aninhados se's. Existe uma maneira de fazer esse switch de tipo como uma única instrução SELECT?

Obrigado!

Foi útil?

Solução

Você precisará do pré -processador para gerar um grande switch. Você precisará get<> Para pesquisas fora de limite. Verifique a saída do compilador para garantir que os casos não utilizados não produzam saída, se você se importa; ajuste conforme necessário; v).

Confira a biblioteca de pré -processador de Boost se você quiser ficar bem nesse tipo de coisa ...

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.
      }
  };

Outras dicas

Eu não acho.

Esse tipo de metaprogramação de modelo é normalmente feito com recursão. Como tudo acontece no tempo de compilação, eu não ficaria surpreso se não houver recursão de tempo de execução ou verificação de condições.

Você sempre pode usar uma pesquisa binária em vez de uma pesquisa linear. Seria mais complicado e mais provável de ter bugs (a pesquisa binária é surpreendentemente fácil de atrapalhar).

Você também pode expandir manualmente n type_switch::operator(), onde n é algum limite superior razoável no número de comprimentos da lista de digitação que você terá em seu programa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top