2011-01-12 13 views
1

私はboost :: anyのベクトルを持ち、このベクトルの 'any'のインデックスを探したいと思います。このようなboost ::任意の比較値ですか?

何か:

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; 
} 

問題は、私はエニーキャストを行う際に、今では唯一にキャストということです:私は、次の方法で2つの任意の値を比較してみてください。このため

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

特定のタイプと基本タイプについて気にしない:

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

答えて

1

あなたの問題はこれらのタイプのキャストを失敗させるライブラリには、基本的な制限があることに注意してください。より一般的には、同じタイプのオブジェクトを取得しようとすると、any_castを使用してboost::anyからオブジェクトを復元することができます。たとえば、この動作しません:

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

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

これはsomething that people have been complaining about for a whileであり、私は回避策を知りません。私はあなたがしたいかもしれない1つのことは、最初にboost::anyと多型を混ぜる理由を考えることです。これを絶対に行う必要がありますが、boost::anyの使用を最小限に抑えることなくこれを修正する良い方法はありません。

0

このアルゴリズムは、2つの昇圧を比較::種類と内容(等号の番号への試みの変換文字列によって任意の値 - 怠惰はに等しい:) http://signmotion.blogspot.com/2011/12/boostany.html

+1

リンクのみの回答ですが、リンクが無効です。 –

+0

リンクが修正されました。 –

関連する問題