#ifndef VARIANT_CAST_HPP #define VARIANT_CAST_HPP #include namespace mapbox { namespace util { namespace detail { template class static_caster { public: template T& operator()(V& v) const { return static_cast(v); } }; template class dynamic_caster { public: using result_type = T&; template T& operator()(V& v, typename std::enable_if::value>::type* = nullptr) const { throw std::bad_cast(); } template T& operator()(V& v, typename std::enable_if::value>::type* = nullptr) const { return dynamic_cast(v); } }; template class dynamic_caster { public: using result_type = T*; template T* operator()(V& v, typename std::enable_if::value>::type* = nullptr) const { return nullptr; } template T* operator()(V& v, typename std::enable_if::value>::type* = nullptr) const { return dynamic_cast(&v); } }; } template typename detail::dynamic_caster::result_type dynamic_variant_cast(V& v) { return mapbox::util::apply_visitor(detail::dynamic_caster(), v); } template typename detail::dynamic_caster::result_type dynamic_variant_cast(const V& v) { return mapbox::util::apply_visitor(detail::dynamic_caster(), v); } template T& static_variant_cast(V& v) { return mapbox::util::apply_visitor(detail::static_caster(), v); } template const T& static_variant_cast(const V& v) { return mapbox::util::apply_visitor(detail::static_caster(), v); } } } #endif // VARIANT_CAST_HPP