1

boost::any のベクトルがあり、このベクトルで「any」のインデックスを見つけたいと考えています。

このようなもの :

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

このために、次の方法で 2 つの任意の値を比較しようとします。

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

問題は、エニーキャストを実行すると、特定のタイプにのみキャストされ、基本タイプを気にしないことです:

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

3 に答える 3

1

あなたの問題は、boost::anyライブラリにこれらの種類のキャストが失敗する根本的な制限があることだと思います。より一般的には、同じ型のオブジェクトを取得しようとした場合にのみ、 boost::anyusingからオブジェクトを回復できます。any_castたとえば、これは機能しません。

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

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

これは人々がしばらくの間不満を抱いていたことであり、私は回避策を知りません. やりたいことの 1 つはboost::any、そもそもポリモーフィズムを混ぜている理由を考えることだと思います。これを絶対に行わなければならない可能性は十分にありますが、boost::any.

于 2011-01-13T02:04:29.587 に答える
0

このアルゴリズムは、2つのboost :: anyの値をタイプとコンテンツで比較します(文字列を数値に変換して等しい-怠惰な等しい:) http://signmotion.blogspot.com/2011/12/boostany.html

于 2012-01-11T10:36:23.987 に答える
0

xany を使用してみてください https://sourceforge.net/projects/extendableany/?source=directory xany クラスを使用すると、既存の機能に新しいメソッドを追加できます。ちなみに、ドキュメンテーションには、あなたが望むことを正確に行う例があります(comparable_anyを作成します)。

于 2012-12-21T20:11:44.550 に答える