2011-01-12 10 views
1

Ich habe einen Vektor von boost :: any und möchte den Index eines 'any' in diesem Vektor finden.boost :: any Vergleichswert?

Etwas wie folgt aus:

vector<any> values; 
any valueISearch = ...; 
find<A*>(valueISearch); 

Dazu versuche ich 2 alle Werte mit dem folgenden Verfahren zu vergleichen:

template <class T> bool IsValueEqualTo(any aniInVector, any value) 
{ 
    if (aniInVector.empty() && value.empty()) 
    return true; 

    if (aniInVector.empty() && !value.empty()) 
    return false; 

    if (!aniInVector.empty() && value.empty()) 
    return false; 

    try 
    { 
    T left = boost::any_cast<T>(aniInVector); 
    T right = boost::any_cast<T>(value); 

    return left == right; 
    } 
    catch(const boost::bad_any_cast &exception) 
    { 
    } 

    return false; 
} 

Das Problem ist, dass jetzt, wenn ich eine Anycast tun es nur zu gieße der spezifische Typ und egal Basistypen:

class A {}; 
class B: public A {}; 
B v1; 
B v2; 
IsValueEqualTo<A*>(&v1, &v2); 

Antwort

1

Ich denke, Ihr Problem ist Es gibt eine grundlegende Einschränkung in der boost::any-Bibliothek, die dazu führt, dass diese Arten von Umwandlungen fehlschlagen. Allgemeiner gesagt, können Sie ein Objekt nur von einem boost::any wiederherstellen, indem Sie any_cast verwenden, wenn Sie versuchen, ein Objekt des identischen Typs abzurufen. Zum Beispiel funktioniert das nicht:

class A { ... }; 
class B: public A { ... }; 

boost::any a = new B*; 
A* ptr = boost::any_cast<A*>(a); // Cast fails 

Dies ist something that people have been complaining about for a while und ich weiß nicht, eine Abhilfe. Ich denke, dass eine Sache, die Sie vielleicht tun möchten, ist zu überlegen, warum Sie boost::any mit Polymorphismus in erster Linie mischen. Es ist durchaus möglich, dass Sie dies unbedingt tun müssen, aber ich sehe keinen guten Weg, dies zu beheben, ohne Ihre Verwendung von boost::any zu minimieren.

0

Dieser Algorithmus vergleicht zwei boost :: alle Werte nach Art und Inhalt (Versuch convert String für equals nummerieren - faul gleich :) http://signmotion.blogspot.com/2011/12/boostany.html

+1

Link-only-Antwort, aber die Verbindung ist tot. –

+0

Der Link ist fixiert. –