Boost.Jede get-original-Typ
Muss ich warf einen any
variable an ein original geben.
Ich brauche, um dies zu tun:
int i = 10;
any a(i);
int& i2 = any_cast<int &>(a);
Aber ich will, dass der Typ-Filialen in any
variable. Und ich Schreibe dies:
int i = 10;
any a(i);
a::type_value& i2 = any_cast<a::type_value &>(a); //there is no actually type_value
Wie kann ich so etwas machen? Oder wie kann ich das extrahieren der original-Typ von der any
variable? Boost.Variante ist bequem entweder.
Wenn ich das nicht tun kann, dann habe ich noch eine Frage, was C++ - Techniken und Bibliotheken speichern können und Holen Sie sich die Art durch eine Funktion, um dieses Problem zu lösen?
- Sie können nicht einfach tun dies mit Boost.Jeder, also mit Boost.Variante statt gehen, um die grundsätzliche Antwort.
- Warum brauchen Sie, um dies zu tun?
Du musst angemeldet sein, um einen Kommentar abzugeben.
C++ ist eine statisch typisierte Sprache. Die Art des
boost::any
ist ein Laufzeit Wert; alle insbesondereany
könnte von einem beliebigen Typ sein. Das ist irgendwie der Punkt.Gibt es keine
any::type_value
, denn das wäre ein compile-Zeit Wert. Undany
ist eine runtime-Konstrukt.Bedenken Sie:
Welche Art ist
any::type_value
? Es ist legal zu nennenTakeAnAny
mit nahezu alle geben. Es gibt keinen einzigen compile-Zeit-Typ, derany::type_value
könnte, zu reduzieren. Und daher gibt es keine Möglichkeit für den compiler zu bestimmen Art. Seit C++ ist statisch typisiert, du bist abgespritzt.Letztlich dem Zweck, jeder ist der Typ-Löschung. Ich habe einige Wert. Und möchte ich weitergeben, dass zu einigen anderen Funktion. Dieser Prozess wird durch verschiedene Kommunikations-Ebenen. Aber ich glaube nicht unbedingt, dass alle diese unterschiedlichen Schichten genau zu wissen, welche Art ich mit. Ich brauche nur mich selbst und meine angestrebte Ziel zu kennen den Typ. So steckt es in eine
any
und Sie sind in Ordnung. Jeder andere sieht nur dieany
ist, und Sie wissen, was es umschließt.Dieser Prozess nur funktioniert, weil beide die Quelle und das Ziel kennen, den tatsächlichen Typ des Wertes. Wenn Sie nicht wissen, den Typ, dann sollten Sie nicht verwenden
any
. Der Zweck derany
ist keine Funktion da sitzen und warf es auf einen Haufen von Typen (das ist, wasboost::variant
ist für). Der Zweck ist, zu löschen, den Typ einer Funktion Unterschrift.Diese können für Dinge wie generische Nachrichten und Signale. Registrieren Sie einen event-handler mit einem system. Sie können Feuer ein Ereignis, das dauert ein
any
als parameter. Die person, die Entlassung der Veranstaltung weiß, dass die "Klick" - Ereignis findet immer einevec2
als parameter. Also jeder "Mausklick" - handler wirft es einvec2
. Das "KeyPress" - Ereignis würde vielleicht passieren Sie eineint32_t
. Also solche Handler cast es zu diesem Typ. Und so weiter. Jeder weiß, welche Art es tatsächlich dauert.Dies geschieht mit
void*
. Das problem dort ist, dass Sie haben Fragen zum Eigentumsrecht (any
ist ein Wert, währendvoid*
ist ein Zeiger). Auch einvoid*
ist also Typ-gelöscht, dass es keine Möglichkeit gibt zu überprüfen, um zu sehen, ob Ihre Stimmen korrekt.any
ist wirklich nur eine Art&Wert-sichervoid*
; es verhindert, dass Sie von casting zu der falsch geben.Sie nicht wirklich wollen
any
. Ihre Nutzung Fall scheint nicht zu wollenvariant
entweder. Was Sie zu wollen scheinen, ist eine Vorlage. Das ist eine andere Art der Sache, und es würde Sie tun, was Sie wirklich wollen: haben Sie eine Funktion verwenden können, eine bestimmte Art, während noch in der Lage, genau zu wissen, was das geben wird.Natürlich, Vorlagen, haben Ihre eigenen Grenzen.
Können Sie eine Karte von
std::type_info
zustd::function<void(boost::any const&)>
Objekt, um sich mit den Typen, die Sie kennen und die Sie zu bewältigen wollen: suchen Sie den Eintrag in der Karte mita.type()
und rufen Sie die entsprechende Funktion, die würde wissen, wie man mit dem argument.boost::any
als Argumente und schließlich rufen Sie eine Funktion auf, wo dieboost::any
wieder gegeben, in irgendeiner form. Zum Beispiel scheint es, dass das anbringen einerboost::any
auf ein Objekt zu halten, beliebige Informationen ist eine vernünftige Sache und der Benutzer der Klasse kann sehr wohl wissen, welche Arten könnte er anfügen.boost::any<>
angebracht sein kann, nachdem alle die Bibliothek existiert aus einem Grund. Aber irgendwie bezweifle ich die OP ist in diesem speziellen Szenario, und ich würde immer noch Stimmen für Boost.Variante, es sei denn, der OP hat einen bestimmten Grund, warum das nicht durchführbar ist. ;-]