summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
55ed2b3)
Add a FuncHelper overload for non-member (free) functions. Rename
MemberFunction to FunctionTraits to reflect that enhancement.
struct FuncHelper : public FuncHelper<decltype(&Func::operator())>
{};
struct FuncHelper : public FuncHelper<decltype(&Func::operator())>
{};
-// Overload for member function with const call operator
-template<typename C, typename R, typename... Args>
-struct FuncHelper<R (C::*)(Args...) const> : public FuncHelper<R (C::*)(Args...)>
-{};
+// Overload for free function
+template<typename R, typename... Args>
+struct FuncHelper<R(*)(Args...)>
+{
+ using FunctionType = std::function<R(Args...)>;
+ using ReturnType = R;
+ using ArgsTuple = std::tuple<Args...>;
+};
// Overload for member function with non-const call operator
template<typename C, typename R, typename... Args>
// Overload for member function with non-const call operator
template<typename C, typename R, typename... Args>
-struct FuncHelper<R (C::*)(Args...)>
+struct FuncHelper<R(C::*)(Args...)> : public FuncHelper<R(*)(Args...)>
- using FunctionType = std::function<R(Args...)>;
- using ReturnType = R;
- using ArgsTuple = std::tuple<Args...>;
+// Overload for member function with const call operator
+template<typename C, typename R, typename... Args>
+struct FuncHelper<R(C::*)(Args...) const> : public FuncHelper<R(C::*)(Args...)>
+{};
+
/// @endcond
} // namespace detail
/// @endcond
} // namespace detail
* Provides traits for the given callable.
*/
template<typename Callable>
* Provides traits for the given callable.
*/
template<typename Callable>
-using MemberFunction = detail::FuncHelper<Callable>;
+using FunctionTraits = detail::FuncHelper<Callable>;
// If *alreadyConnected is true, just returns false to prevent multiple connections.
static const auto tryConnect = [](const QObject* object, auto sig, auto receiver, auto slot, bool* alreadyConnected) {
if (!*alreadyConnected) {
// If *alreadyConnected is true, just returns false to prevent multiple connections.
static const auto tryConnect = [](const QObject* object, auto sig, auto receiver, auto slot, bool* alreadyConnected) {
if (!*alreadyConnected) {
- auto widget = qobject_cast<const typename MemberFunction<decltype(sig)>::ClassType*>(object);
+ auto widget = qobject_cast<const typename FunctionTraits<decltype(sig)>::ClassType*>(object);
if (widget) {
*alreadyConnected = QObject::connect(widget, sig, receiver, slot);
return *alreadyConnected;
if (widget) {
*alreadyConnected = QObject::connect(widget, sig, receiver, slot);
return *alreadyConnected;