I stumbled across https://github.com/bytemaster/Boost.DynamicAny which implements, in a fully backward compatible manner, dynamic cast functionality for boost::any. That is, it can give you X* from an 'any' holding a value of type Y if Y derives from X. It achieves this by simply changing template<typename ValueType> class holder : public placeholder { ValueType held; to template<typename ValueType> class holder : public placeholder, public ValueType which then enables dynamic_cast from holder<>* to OtherValueType*. This is pretty cool, and I don't remember seeing this idea anywhere else. Perhaps we should adopt it? One might even argue that this is how any_cast should always have worked, but I suppose we can't change it now for compatibility reasons. Although it's an interesting question whether C++17 'any' shouldn't be enhanced in this manner.