STL Support: enhance behavior of cm::dynamic_reference_cast

Ensure cm::dynamic_reference_cast has same behavior as dynamic_cast
on reference: raise std::bad_cast if dynamic_cast is not possible.
This commit is contained in:
Marc Chevrier
2020-01-12 17:26:12 +01:00
parent 04c2f67492
commit b9a3f2e7e2

View File

@@ -6,6 +6,8 @@
#ifndef cmext_memory
#define cmext_memory
#include <typeinfo>
#include <cm/type_traits>
namespace cm {
@@ -24,7 +26,13 @@ template <typename T, typename O,
int> = 0>
T& dynamic_reference_cast(O& item)
{
return *(dynamic_cast<T*>(item.get()));
auto p = dynamic_cast<T*>(item.get());
if (p == nullptr) {
throw std::bad_cast();
}
return *p;
}
} // namespace cm