Browse Source

[util] Fix TFunctionRef under MSVC

sskvor 2 years ago
parent
commit
d10b241085
3 changed files with 23 additions and 6 deletions
  1. 2 2
      util/CMakeLists.darwin.txt
  2. 2 2
      util/CMakeLists.linux.txt
  3. 19 2
      util/generic/function_ref.h

+ 2 - 2
util/CMakeLists.darwin.txt

@@ -26,7 +26,6 @@ target_sources(yutil PRIVATE
   ${CMAKE_SOURCE_DIR}/util/digest/city.cpp
   ${CMAKE_SOURCE_DIR}/util/random/random.cpp
   ${CMAKE_SOURCE_DIR}/util/string/cast.cpp
-  ${CMAKE_SOURCE_DIR}/util/generic/function_ref.cpp
 )
 target_joined_source(yutil
   all_datetime.cpp
@@ -63,7 +62,6 @@ target_joined_source(yutil
 )
 target_joined_source(yutil
   all_generic.cpp
-  ${CMAKE_SOURCE_DIR}/util/generic/scope.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/adaptor.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/algorithm.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/array_ref.cpp
@@ -78,6 +76,7 @@ target_joined_source(yutil
   ${CMAKE_SOURCE_DIR}/util/generic/fastqueue.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/flags.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/function.cpp
+  ${CMAKE_SOURCE_DIR}/util/generic/function_ref.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/fwd.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/guid.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/hash.cpp
@@ -102,6 +101,7 @@ target_joined_source(yutil
   ${CMAKE_SOURCE_DIR}/util/generic/ptr.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/queue.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/refcount.cpp
+  ${CMAKE_SOURCE_DIR}/util/generic/scope.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/serialized_enum.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/set.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/singleton.cpp

+ 2 - 2
util/CMakeLists.linux.txt

@@ -26,7 +26,6 @@ target_sources(yutil PRIVATE
   ${CMAKE_SOURCE_DIR}/util/digest/city.cpp
   ${CMAKE_SOURCE_DIR}/util/random/random.cpp
   ${CMAKE_SOURCE_DIR}/util/string/cast.cpp
-  ${CMAKE_SOURCE_DIR}/util/generic/function_ref.cpp
   ${CMAKE_SOURCE_DIR}/util/system/valgrind.cpp
   ${CMAKE_SOURCE_DIR}/util/system/mktemp_system.cpp
 )
@@ -65,7 +64,6 @@ target_joined_source(yutil
 )
 target_joined_source(yutil
   all_generic.cpp
-  ${CMAKE_SOURCE_DIR}/util/generic/scope.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/adaptor.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/algorithm.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/array_ref.cpp
@@ -80,6 +78,7 @@ target_joined_source(yutil
   ${CMAKE_SOURCE_DIR}/util/generic/fastqueue.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/flags.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/function.cpp
+  ${CMAKE_SOURCE_DIR}/util/generic/function_ref.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/fwd.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/guid.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/hash.cpp
@@ -104,6 +103,7 @@ target_joined_source(yutil
   ${CMAKE_SOURCE_DIR}/util/generic/ptr.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/queue.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/refcount.cpp
+  ${CMAKE_SOURCE_DIR}/util/generic/scope.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/serialized_enum.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/set.cpp
   ${CMAKE_SOURCE_DIR}/util/generic/singleton.cpp

+ 19 - 2
util/generic/function_ref.h

@@ -5,11 +5,28 @@
 
 #include <functional>
 
-template <typename Signature>
+namespace NPrivate {
+
+    template <typename Signature>
+    struct TIsNoexcept;
+
+    template <typename Ret, typename... Args>
+    struct TIsNoexcept<Ret(Args...)> {
+        static constexpr bool Value = false;
+    };
+
+    template <typename Ret, typename... Args>
+    struct TIsNoexcept<Ret(Args...) noexcept> {
+        static constexpr bool Value = true;
+    };
+
+} // namespace NPrivate
+
+template <typename Signature, bool IsNoexcept = NPrivate::TIsNoexcept<Signature>::Value>
 class TFunctionRef;
 
 template <typename Ret, typename... Args, bool IsNoexcept>
-class TFunctionRef<Ret(Args...) noexcept(IsNoexcept)> {
+class TFunctionRef<Ret(Args...) noexcept(IsNoexcept), IsNoexcept> {
 public:
     using TSignature = Ret(Args...) noexcept(IsNoexcept);