Question

est 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);
        }
      }
  };

Il est utilisé pour typeswitching sur une TypeListe. La question est - ils font cela par une série de imbriquée si son. Est-il possible de faire ce commutateur de type comme une seule instruction select au lieu?

Merci!

Était-ce utile?

La solution

Vous aurez besoin du préprocesseur pour générer un grand switch. Vous aurez besoin get<> de no-op hors lookups lié. Vérifiez la sortie du compilateur pour être sûr que les cas non utilisés ne produisent pas de sortie, si vous vous souciez; ajuster, si nécessaire;. v)

Consultez la Boost préprocesseur Library si vous tenez à obtenir de bons à ce genre de chose ...

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

Autres conseils

Je ne pense pas.

Ce genre de métaprogrammation modèle est normalement fait avec récursivité. Comme il arrive tout à la compilation, je ne serais pas surpris s'il n'y a pas récursion d'exécution ou état-chèques.

Vous pouvez toujours utiliser une recherche binaire au lieu d'une recherche linéaire. Il serait plus compliqué et plus susceptibles d'avoir des bugs dans ce (recherche binaire est étonnamment facile à gâcher).

Vous pouvez également étendre manuellement N type_switch::operator(), où N est une limite supérieure raisonnable sur le nombre de typelist que vous aurez des longueurs dans votre programme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top