Boost vergleichen: beliebige Inhalte

8

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 ):

%Vor%

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%     
d83 17.05.2011, 09:50
quelle

5 Antworten

3

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.

%Vor%

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.

    
Tony Delroy 17.05.2011, 10:38
quelle
4

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!)

%Vor%

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".

%Vor%

Und erweitern Sie den Konstruktor von any .

%Vor%

Dann haben wir eine Spezialisierung von less (oder operator< )

bereitgestellt %Vor%

Hinweis: Encapsulation, etc ... sind als Übung für den Leser

übrig     
Matthieu M. 17.05.2011 12:06
quelle
1

Es 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).

    
ArmanHunanyan 21.12.2012 20:05
quelle
1

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.

    
Andrey Syrokomskiy 10.01.2012 12:50
quelle
1

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:

%Vor%

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.

    
magras 23.08.2016 16:03
quelle

Tags und Links