Any Any::operator + (const Any &r) const { switch (this->type()) { case Any::Int: switch (r.type()) { case Any::Int: return this->getInt() + r.getInt(); case Any::Float: return this->getInt() + r.getFloat(); case Any::String: return boost::lexical_cast<string>(this->getInt()) + r.getString(); } break; case Any::Float: switch (r.type()) { case Any::Int: return this->getFloat() + r.getInt(); case Any::Float: return this->getFloat() + r.getFloat(); case Any::String: return boost::lexical_cast<string>(this->getFloat()) + r.getString(); } break; case Any::String: switch (r.type()) { case Any::Int: return this->getString() + boost::lexical_cast<string>(r.getInt()); case Any::Float: return this->getString() + boost::lexical_cast<string>(r.getFloat()); case Any::String: return this->getString() + r.getString(); } break; } FIXME("Unsupported operation %s + %s", this->typeInfo().name(), r.typeInfo().name()); return 0; }