
Hi The following is a partial solution for boost::any operations, including operator==. Adding the operator ValueType& as follows: template <typename ValueType> operator typename ValueType&() const { if (empty() || type() != typeid(ValueType)) boost::throw_exception(bad_any_cast()); return static_cast<any::holder<ValueType> *>(content)->held; } This is different from any_cast in that it returns a reference, instead of a copy. Note also that this will never be used implicitely, you have to call operator ValueType&() explicitely. Operations with values can be added as: template <typename ValueType> bool operator==(const ValueType& rhs) { return rhs == this->operator ValueType&(); } Or template <typename ValueType> any& operator+=(const ValueType& rhs) { this->operator ValueType&() += rhs; return *this; } All operators could be added this way. While this won't break existing code and allows for any object operations, it still has the following drawbacks: 1. No type conversion is performed, (due to template argument deduction). Thus a float can be compared or added to another float, but not to a long, for instance. 2. No operations between any objects can be performed, only between an any and a concret object. 3. The order matters. 0 == any(0) won't compile, while any(0) == 0 will do. 4. It is easy to forget that all operations may throw. If you have any idea of how to overcome (or improve) any of these please let me know. By the way, I'm testing with VC 8.0 and the program compiles and behaves identically calling operator ValueType&() or operator ValueType() with the above declaration. Is that correct? Cheers Jorge