From: Jorge Lodos (lodos_at_[hidden])
Date: 2006-04-17 15:47:40


Hi
It would be nice if operator== could be added to boost::any. A partial
solution would be the following:
 
template<typename ValueType>
bool operator==(const ValueType & rhs) const
{
  return content ? content->equal(any(rhs).content) :
                   content == any(rhs).content;
}
 
bool operator==(const any &rhs) const
{
  return content && rhs.content ?
             content->equal(rhs.content) :
             content == rhs.content;
}
 
equal is a pure virtual member of placeholder declared as:
 
virtual bool equal(const placeholder *rhs) const = 0;
 
and implemented as (in holder):
 
virtual bool equal(const placeholder *rhs) const
{
  return type() == rhs->type() &&
    held == static_cast<const holder<ValueType>*>(rhs)->held;
}
 
However, this will break existing code when the holded object class does no
have operator== defined.
Kevlin Henney proposed:
 
namespace equality
{
  template<typename Type>
  bool operator==(const Type &lhs, const Type &rhs)
  {
    return &lhs == &rhs;
  }
}
 
virtual bool equal(const placeholder *rhs) const
{
  using namespace equality;
  return type() == rhs->type() &&
    held == static_cast<const holder<ValueType>*>(rhs)->held;
}
 
Thus providing a default operator== for everyone not having its own, which
returns true if the object addresses are the same. This will prevent
compiler errors when the operator== really needed to be there.
What I think is needed is:
1. If operator== is not used there should be no need for holded classes to
implement it.
2. If operator== is used, and the holded class does not define it, the code
must not compile.
 
Do you think this is possible to implement?
 
Thanks in advance
Jorge Lodos