Verwendung von typeid, um verschiedene Typen zu behandeln

8

Ich versuche boost :: any zu verwenden, um die sqlite-Rückgabewerte einzukapseln. Ich habe dann versucht, eine Schleife zu schreiben, um diese zu drucken.

Mein erster Gedanke war etwas wie:

%Vor%

Nun für den erfahrenen Programmierer wird es offensichtlich, dass dies nicht funktionieren kann, da Typid eine Instanz anstelle einer numerischen ID zurückgibt. Nach einigen Recherchen dachte ich, ich könnte versuchen entweder typeid(...).hash_code() , aber dies ist nicht ausreichend constexpr qualifiziert (Neben der Gefahr von Hash-Kollision).

Fragen

  1. Gibt es einen besseren Weg als ein übergroßes if ... else ... labyrinth zu erstellen, um Objekte basierend auf ihrem typeid zu behandeln?
  2. Gibt es einen Grund, warum hash_code nicht const_expr ist? Ist das ein Ergebnis der getrennten Zusammenstellung von Objektdateien?
  3. Was nutzt std::type_index ? Wenn man bedenkt, dass es nur einige zusätzliche Operatoren bietet ( < , <= , > , >= ), warum war es nicht möglich, seine Funktionalität mit std::type_info ?
  4. zu integrieren
ted 08.12.2014, 22:59
quelle

2 Antworten

6

Ich habe das Gefühl, dass Sie nach Boost-Varianten und statischen Besuchen suchen.

Da Varianten nicht erwähnt wurden, könnte es sich lohnen, diese als Antwort zu veröffentlichen. Demonstruction:

Live auf Coliru %Vor%

Druckt

%Vor%     
sehe 09.12.2014, 12:06
quelle
4

Hier ist eine Implementierung von etwas, das dem statischen Besuch auf boost::any ähnelt und C ++ 11 lambdas verwendet:

%Vor%

( Demo )

Die Idee ist, dass Sie ein boost::any oder boost::any const als erstes Argument an any_call übergeben und danach mehrere lambdas übergeben. Das erste Lambda, dessen Parametertyp mit dem in boost::any enthaltenen Objekttyp übereinstimmt, wird aufgerufen, und any_call gibt true zurück. Wenn kein Lambda übereinstimmt, gibt any_call den Wert false zurück.

    
cdhowie 09.12.2014 14:32
quelle

Tags und Links