Quellcode durchsuchen

Implement cm::static_reference_cast by declval

Previously, cm::static_reference_cast used invoke_result_t and took the
address of O::get. This is not in complete conformance with standard.

This MR changes the implementation to use std::declval<O>.get() which is
always well-defined.
Sumit Bhardwaj vor 5 Jahren
Ursprung
Commit
782d7387d5
1 geänderte Dateien mit 9 neuen und 8 gelöschten Zeilen
  1. 9 8
      Utilities/std/cmext/memory

+ 9 - 8
Utilities/std/cmext/memory

@@ -12,18 +12,19 @@
 
 
 namespace cm {
 namespace cm {
 
 
-template <typename T, typename O,
-          cm::enable_if_t<
-            std::is_pointer<cm::invoke_result_t<decltype(&O::get), O>>::value,
-            int> = 0>
+template <
+  typename T, typename O,
+  cm::enable_if_t<std::is_pointer<decltype(std::declval<O>().get())>::value,
+                  int> = 0>
 T& static_reference_cast(O& item)
 T& static_reference_cast(O& item)
 {
 {
   return *(static_cast<T*>(item.get()));
   return *(static_cast<T*>(item.get()));
 }
 }
-template <typename T, typename O,
-          cm::enable_if_t<
-            std::is_pointer<cm::invoke_result_t<decltype(&O::get), O>>::value,
-            int> = 0>
+
+template <
+  typename T, typename O,
+  cm::enable_if_t<std::is_pointer<decltype(std::declval<O>().get())>::value,
+                  int> = 0>
 T& dynamic_reference_cast(O& item)
 T& dynamic_reference_cast(O& item)
 {
 {
   auto p = dynamic_cast<T*>(item.get());
   auto p = dynamic_cast<T*>(item.get());