diff --git a/src/corelib/thread/qrunnable.h b/src/corelib/thread/qrunnable.h index 80945351ee1..756156e583e 100644 --- a/src/corelib/thread/qrunnable.h +++ b/src/corelib/thread/qrunnable.h @@ -101,27 +101,35 @@ public: namespace QtPrivate { template -using is_function_pointer = std::conjunction, std::is_function>>; +constexpr inline bool is_function_pointer_v = std::conjunction_v< + std::is_pointer, + std::is_function> + >; template -struct is_std_function : std::false_type {}; +constexpr inline bool is_std_function_v = false; template -struct is_std_function> : std::true_type {}; +constexpr inline bool is_std_function_v> = true; } // namespace QtPrivate template > QRunnable *QRunnable::create(Callable &&functionToRun) { - bool is_null = false; - if constexpr(QtPrivate::is_std_function>::value) - is_null = !functionToRun; - - if constexpr(QtPrivate::is_function_pointer>::value) { - const void *functionPtr = reinterpret_cast(functionToRun); - is_null = !functionPtr; + using F = std::decay_t; + constexpr bool is_std_function = QtPrivate::is_std_function_v; + constexpr bool is_function_pointer = QtPrivate::is_function_pointer_v; + if constexpr (is_std_function || is_function_pointer) { + bool is_null; + if constexpr (is_std_function) { + is_null = !functionToRun; + } else if constexpr (is_function_pointer) { + // shut up warnings about functions always having a non-null address: + const void *functionPtr = reinterpret_cast(functionToRun); + is_null = !functionPtr; + } + if (is_null) + return warnNullCallable(); } - if (is_null) - return warnNullCallable(); return new QGenericRunnable(std::forward(functionToRun)); }