28 #ifndef YB_INC_ystdex_cast_hpp_
29 #define YB_INC_ystdex_cast_hpp_ 1
34 #include <initializer_list>
53 template<
typename _tDst,
typename _tSrc>
57 static_assert(is_pod<_tDst>::value,
"Non-POD destination type found.");
58 static_assert(
sizeof(_tSrc) ==
sizeof(_tDst),
"Incompatible types found.");
75 template<
typename _tDst,
typename... _tSrc>
93 template <
typename _pDst,
class _tSrc>
97 static_assert(is_polymorphic<_tSrc>::value,
"Non-polymorphic class found.");
98 static_assert(is_pointer<_pDst>::value,
"Non-pointer destination found.");
100 const auto tmp(dynamic_cast<_pDst>(x));
103 throw std::bad_cast();
118 template <
typename _pDst,
class _tSrc>
122 static_assert(is_polymorphic<_tSrc>::value,
"Non-polymorphic class found.");
123 static_assert(is_pointer<_pDst>::value,
"Non-pointer destination found.");
124 static_assert(is_base_of<_tSrc,
typename remove_cv<
typename remove_pointer<
125 _pDst>::type>::type>::value,
"Wrong destination type found.");
127 yassume(dynamic_cast<_pDst>(x) == x);
129 return static_cast<_pDst
>(x);
140 template <
typename _rDst,
class _tSrc>
144 static_assert(is_reference<_rDst>::value,
145 "Non-reference destination found.");
148 _rDst>::type*>(std::addressof(x));
163 template <
typename _pDst,
class _tSrc>
167 static_assert(is_polymorphic<_tSrc>::value,
"Non-polymorphic class found.");
168 static_assert(is_pointer<_pDst>::value,
"Non-pointer destination found.");
170 auto p(dynamic_cast<_pDst>(x));
184 template <
typename _rDst,
class _tSrc>
188 static_assert(is_reference<_rDst>::value,
189 "Non-reference destination found.");
192 _rDst>::type*>(std::addressof(x));
199 template<
typename _tFrom,
typename _tTo,
bool _bNonVirtualDownCast>
205 return ystdex::polymorphic_downcast<_tTo>(x);
208 template<
typename _tFrom,
typename _tTo>
214 return dynamic_cast<_tTo
>(x);
218 template<
typename _tFrom,
typename _tTo,
bool _bUseStaticCast>
227 template<
typename _tFrom,
typename _tTo>
239 template<
typename _type>
248 template<
typename _type>
258 template<
typename _tFrom,
typename _tTo>
260 :
public integral_constant<bool, is_convertible<_tFrom, _tTo>::value>
278 template<
typename _tDst,
typename _tSrc>
285 template<
typename _tDst,
typename _tSrc>
292 template<
typename _tDst,
typename _tSrc>