Frage

Dies ist von 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);
        }
      }
  };

Es ist für typeswitching auf einem Typelist verwendet. Die Frage ist - sie tun dies über eine Reihe von, wenn die verschachtelt. Gibt es eine Möglichkeit, diese Art Schalter als eine einzelne select-Anweisung zu tun statt?

Danke!

War es hilfreich?

Lösung

Sie werden den Präprozessor brauchen eine große switch zu erzeugen. Sie werden get<> zu no-op müssen Lookups out-of-gebunden. Überprüfen Sie die Compilerausgabe sicher sein ungenutzt Fällen keine Ausgabe produzieren, wenn Sie sich interessieren; bei Bedarf nachjustieren, v.)

Überprüfen Sie die Boost-Preprocessor Bibliothek, wenn Sie sich interessieren an dieser Art der Sache gut zu bekommen ...

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

Andere Tipps

Ich glaube nicht, dass so.

Diese Art der Metaprogrammierung ist in der Regel mit Rekursion getan. Da es bei der Kompilierung-Zeit passiert, würde ich nicht überrascht sein, wenn es keine Laufzeit Rekursion oder zustandsüberprüft ist.

Sie können immer eine binäre Suche statt einer linearen Suche verwenden. Es wäre kompliziert und eher Fehler in ihm haben (binäre Suche ist überraschend einfach zu vermasseln).

Sie können auch N type_switch::operator() manuell erweitern aus, wobei N eine vernünftige ist oberen auf die Anzahl der Typliste Längen gebunden Sie in Ihrem Programm haben wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top