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

这是人们一直在抱怨的事情,我不知道解决方法。我认为您可能想做的一件事是首先考虑为什么要boost::any与多态性混合。很有可能您绝对必须这样做,但我看不出在不尽量减少使用boost::any.

于 2011-01-13T02:04:29.587 回答
0

尝试使用 xany https://sourceforge.net/projects/extendableany/?source=directory xany 类允许向任何现有功能添加新方法。顺便说一句,文档中有一个示例可以完全满足您的要求(创建可比较的_any)。

于 2012-12-21T20:11:44.550 回答
0

此算法按类型和内容比较两个 boost::any 值(尝试将字符串转换为数字以表示等于 -惰性等于:) http://signmotion.blogspot.com/2011/12/boostany.html

于 2012-01-11T10:36:23.987 回答