瀏覽代碼

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.
Marc Chevrier 5 年之前
父節點
當前提交
b9a3f2e7e2
共有 1 個文件被更改,包括 9 次插入1 次删除
  1. 9 1
      Utilities/std/cmext/memory

+ 9 - 1
Utilities/std/cmext/memory

@@ -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