@@ -422,10 +422,50 @@ class any {
423}; // class any
423}; // class any
426+ template <typename T, typename U=void>
427+ struct TagHelper {};
430+ struct TagHelper<string> {
431+ static constexpr any::Tag tag = any::Tag::String;
435+ struct TagHelper<const char *> {
436+ static constexpr any::Tag tag = any::Tag::String;
440+ struct TagHelper<any::dict<N>> {
441+ static constexpr any::Tag tag = any::Tag::Dictionary;
445+ struct TagHelper<any::data<N>> {
446+ static constexpr any::Tag tag = any::Tag::Data;
450+ struct TagHelper<any::array> {
451+ static constexpr any::Tag tag = any::Tag::Array;
455+ struct TagHelper<any::record> {
456+ static constexpr any::Tag tag = any::Tag::Record;
459+ template <typename T>
460+ struct TagHelper<T> {
461+ static constexpr any::Tag tag = any::Tag::Pointer;
425template <typename T,
465template <typename T,
426 typename = typename std::enable_if<std::is_class<T>::value>::type>
466 typename = typename std::enable_if<std::is_class<T>::value>::type>
427inline auto cast_managed(const any& a) -> T& {
467inline auto cast_managed(const any& a) -> T& {
428− return *static_cast<T*>(a.extractPointer(IF_DEBUG(any::Tag::Pointer)));
468+ return *static_cast<T*>(a.extractPointer(IF_DEBUG(Private::TagHelper<T>::tag)));
431// TODO: Deprecated - use static_cast
471// TODO: Deprecated - use static_cast
@@ -451,7 +491,7 @@ namespace dict {
452 template <size_t N>
492 template <size_t N>
453 inline auto get(const any& a) -> const any& {
493 inline auto get(const any& a) -> const any& {
454− return (*static_cast<const any::dict<N+1>*>(a.extractPointer(IF_DEBUG(any::Tag::Dictionary))))[N].second;
494+ return cast_managed<any::dict<N+1>>(a)[N].second;
457 template <size_t N>
497 template <size_t N>
@@ -469,7 +509,7 @@ namespace dict {
471 inline auto get(const Private::Symbol key, const any& a) -> const any& {
511 inline auto get(const Private::Symbol key, const any& a) -> const any& {
472− return get(key, *static_cast<const any::dict<unknown_size>*>(a.extractPointer(IF_DEBUG(any::Tag::Dictionary))));
512+ return get(key, cast_managed<any::dict<unknown_size>>(a));
475 #define P(N) any::dict_pair&& arg ## N
515 #define P(N) any::dict_pair&& arg ## N
@@ -517,7 +557,7 @@ namespace data {
518 template <size_t N>
558 template <size_t N>
519 inline auto get(const any& a) -> const any& {
559 inline auto get(const any& a) -> const any& {
520− return (*static_cast<const any::data<N+1>*>(a.extractPointer(IF_DEBUG(any::Tag::Data))))[N];
560+ return cast_managed<any::data<N+1>>(a)[N];
523 template <typename T>
563 template <typename T>