cast: allow cast::known for non-class types
This commit is contained in:
parent
67c5ef5d78
commit
de1d9649a3
61
cast.hpp
61
cast.hpp
@ -144,35 +144,6 @@ namespace cruft::cast {
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/// Assert if the value is not a pointer to a subclass of T, else return
|
||||
/// the converted value. Note: this is only a debug-time check and is
|
||||
/// compiled out in optimised builds.
|
||||
template <
|
||||
concepts::pointer T,
|
||||
typename V
|
||||
>
|
||||
T
|
||||
known (V *const v)
|
||||
{
|
||||
CHECK (dynamic_cast<T> (v));
|
||||
return static_cast<T> (v);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
template <
|
||||
concepts::reference T,
|
||||
typename V
|
||||
>
|
||||
T
|
||||
known (V &v)
|
||||
{
|
||||
CHECK_NOTHROW (dynamic_cast<T> (v));
|
||||
return reinterpret_cast<T> (v);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/// Cast a pointer from one type to another, asserting that the required
|
||||
/// alignment of the destination type has been satisfied.
|
||||
@ -196,6 +167,38 @@ namespace cruft::cast {
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/// Assert if the value is not a pointer to a subclass of T, else return
|
||||
/// the converted value. Note: this is only a debug-time check and is
|
||||
/// compiled out in optimised builds.
|
||||
template <
|
||||
concepts::pointer T,
|
||||
typename V
|
||||
>
|
||||
T
|
||||
known (V *const v)
|
||||
{
|
||||
if constexpr (std::is_class_v<V>) {
|
||||
CHECK (dynamic_cast<T> (v));
|
||||
}
|
||||
|
||||
return alignment<T> (v);
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
template <
|
||||
concepts::reference T,
|
||||
typename V
|
||||
>
|
||||
T
|
||||
known (V &v)
|
||||
{
|
||||
CHECK_NOTHROW (dynamic_cast<T> (v));
|
||||
return reinterpret_cast<T> (v);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
/// Cast from SrcT to DstT and damn any consequences; just make it compile.
|
||||
template <typename DstT, typename SrcT>
|
||||
|
Loading…
Reference in New Issue
Block a user