Ich verwende einen Container, um eine Liste von Zeigern zu enthalten:
%Vor% Um Elemente in diesen Container einzufügen, hatte ich ein paar Hilfsfunktionen geschrieben (Mitglieder von struct Example
):
Nun möchte ich Elemente nur einfügen, wenn sie in diesem Container nicht vorhanden sind. Um dies zu tun, dachte ich, dass ich search
über elements
nur mit einer entsprechenden Vergleichsfunktion aufrufen müsste. Allerdings kann ich die boost::any
Instanzen nicht vergleichen.
Meine Frage:
Ich weiß, dass meine boost::any
-Instanzen immer einen Zeiger auf etwas enthalten; Ist es möglich, zwei boost::any
-Werte zu vergleichen?
update
Ich danke Ihnen für Ihre Antworten. Ich habe es auch auf eine wahrscheinlich unsichere Weise geschafft: mit boost::unsafe_any_cast
eine void**
zu erhalten und den zugrunde liegenden Zeiger zu vergleichen.
Im Moment funktioniert das gut. Ich würde jedoch Ihre Kommentare zu schätzen wissen: vielleicht ist das ein großer Fehler!
%Vor% Der einzige einfache Weg, um dies zu tun, ist die Hardcoding-Unterstützung für die Typen, die Sie in den any
-Instanzen speichern, wodurch die Nützlichkeit von any
... untergraben wird.
In C ++ 11s type_index
können Sie std::map
oder std::unordered_map
verwenden. eingegeben am std::type_index(some_boost_any_object.type())
- ähnlich dem, was Alexandre in seinem Kommentar unten vorschlägt.
Sie können es nicht direkt angeben, aber Sie können tatsächlich any
als zugrunde liegenden Typ verwenden ... obwohl es für Zeiger sinnlos ist (ah!)
Und ein Vorlagenkonstruktor:
%Vor% Dies ist im Grunde boost::any
.
Jetzt müssen wir es mit unserem Vergleichsmechanismus "erweitern".
Um dies zu tun, werden wir die Implementierung von std::less
"erfassen".
Und erweitern Sie den Konstruktor von any
.
Dann haben wir eine Spezialisierung von less
(oder operator<
)
Hinweis: Encapsulation, etc ... sind als Übung für den Leser
übrigEs muss keine neue Klasse erstellt werden. Versuchen Sie, xany Ссылка zu verwenden. Mit xany class können neue Methoden zu bestehenden Funktionen hinzugefügt werden. Übrigens gibt es ein Beispiel in der Dokumentation, das genau das tut, was Sie wollen (erstellt compare_any).
Vielleicht ist dieser Algorithmus nützlich & gt; Ссылка
Vergleiche zwei beliebige Werte nach Typ und Inhalt. Versuchen Sie, die Zeichenfolge in eine Zahl für equals umzuwandeln.
Wenn Sie den Typ container ändern können, gibt es Boost.TypeErasure . Es bietet eine einfache Möglichkeit, any
anzupassen. Zum Beispiel verwende ich solche Typedef für ähnliche Zwecke:
Foo
verhält sich genauso wie boost::any
, außer dass es für die Gleichheit verglichen werden kann und boost::type_erasure::any_cast
anstelle von boost::any_cast
verwendet.