【问题标题】:boost::any compare value?boost::任何比较值?
【发布时间】:2011-01-12 12:13:54
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    我认为您的问题是 boost::any 库中有一个基本限制导致这些类型的转换失败。更一般地说,如果您尝试检索相同类型的对象,则只能使用 any_castboost::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,我不知道解决方法。我认为您可能想做的一件事是首先考虑为什么要将boost::any 与多态性混合在一起。很有可能您绝对必须这样做,但如果不尽量减少您对 boost::any 的使用,我看不到解决此问题的好方法。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 仅链接答案,但链接已失效。
        • 链接已修复。
        猜你喜欢
        • 1970-01-01
        • 2016-11-18
        • 1970-01-01
        • 1970-01-01
        • 2019-12-30
        • 2023-03-24
        • 1970-01-01
        • 2023-04-09
        • 2013-01-03
        相关资源
        最近更新 更多