Fixed type deduction on old compilers

This commit is contained in:
Antony Polukhin
2015-02-03 13:00:37 +03:00
parent 84ab59227d
commit dc25edb4dd

View File

@@ -42,19 +42,19 @@ namespace boost
namespace detail namespace detail
{ {
template <typename Target, typename Source> template <typename Target, typename Source>
struct static_pointer_cast_result struct dynamic_pointer_cast_result
{ {
#ifdef BOOST_NO_CXX11_DECLTYPE #ifdef BOOST_NO_CXX11_DECLTYPE
BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested, static_pointer_cast<Target>(boost::declval<Source>())) BOOST_TYPEOF_NESTED_TYPEDEF_TPL(nested, dynamic_pointer_cast<Target>(boost::declval<Source>()))
typedef typename nested::type type; typedef typename nested::type type;
#else #else
typedef decltype(static_pointer_cast<Target>(boost::declval<Source>())) type; typedef decltype(dynamic_pointer_cast<Target>(boost::declval<Source>())) type;
#endif #endif
}; };
} }
template <typename Target, typename Source> template <typename Target, typename Source>
inline typename detail::static_pointer_cast_result<Target, Source>::type inline typename detail::dynamic_pointer_cast_result<Target, Source>::type
polymorphic_pointer_downcast (const Source& x) polymorphic_pointer_downcast (const Source& x)
{ {
BOOST_ASSERT(dynamic_pointer_cast<Target> (x) == x); BOOST_ASSERT(dynamic_pointer_cast<Target> (x) == x);
@@ -62,10 +62,10 @@ namespace boost
} }
template <typename Target, typename Source> template <typename Target, typename Source>
inline typename detail::static_pointer_cast_result<Target, Source>::type inline typename detail::dynamic_pointer_cast_result<Target, Source>::type
polymorphic_pointer_cast (const Source& x) polymorphic_pointer_cast (const Source& x)
{ {
typename detail::static_pointer_cast_result<Target, Source>::type tmp typename detail::dynamic_pointer_cast_result<Target, Source>::type tmp
= dynamic_pointer_cast<Target> (x); = dynamic_pointer_cast<Target> (x);
if ( !tmp ) boost::throw_exception( std::bad_cast() ); if ( !tmp ) boost::throw_exception( std::bad_cast() );