boost :: any сравнить значение? - PullRequest
1 голос
/ 12 января 2011

У меня есть вектор 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;
 }

Проблема в том, что теперь, когда я делаю anycast, он приводит только к определенному типу и не заботится об основных типах:

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

Ответы [ 3 ]

1 голос
/ 13 января 2011

Я думаю, что ваша проблема в том, что в библиотеке boost::any есть фундаментальное ограничение, которое приводит к сбою такого рода приведений.В более общем смысле вы можете восстановить объект из boost::any с помощью 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.

0 голосов
/ 22 декабря 2012

Попробуйте использовать xany https://sourceforge.net/projects/extendableany/?source=directory Класс xany позволяет добавлять новые методы к любой существующей функциональности.Кстати, в документации есть пример, который делает именно то, что вы хотите (создает сопоставимый_все).

0 голосов
/ 11 января 2012

Этот алгоритм сравнивает два повышения: любые значения по типу и содержанию (попытка преобразовать строку в число для равенства - ленивый равно :) http://signmotion.blogspot.com/2011/12/boostany.html

...