boost ::任何比较值?

时间:2011-01-12 12:13:54

标签: c++ boost casting operator-keyword boost-any

我有一个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);

3 个答案:

答案 0 :(得分:1)

我认为你的问题是boost::any库存在一个基本限制,导致这些类型的强制转换失败。更一般地说,如果您尝试检索相同类型的对象,则只能使用boost::anyany_cast恢复对象。例如,这不起作用:

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,我不知道解决方法。我认为您可能想要做的一件事就是考虑为什么首先将boost::any与多态混合。你绝对必须这样做,但我没有看到一个很好的方法来解决这个问题,而不会最大限度地减少你对boost::any的使用。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

尝试使用xany https://sourceforge.net/projects/extendableany/?source=directory xany类允许向任何现有功能添加新方法。顺便提一下,文档中有一个例子可以完全符合您的要求(创建Matched_any)。