+// Helper for invoking the callable, wrapping its return value in a QVariant (default-constructed if callable returns void).
+// The correct overload is selected via SFINAE.
+template<typename Callable, typename ...Args>
+auto invokeWithArgs(const Callable& c, Args&&... args)
+ -> std::enable_if_t<std::is_void<typename FunctionTraits<Callable>::ReturnType>::value, QVariant>
+{
+ c(std::forward<Args>(args)...);
+ return QVariant{};
+}
+
+template<typename Callable, typename ...Args>
+auto invokeWithArgs(const Callable& c, Args&&... args)
+ -> std::enable_if_t<!std::is_void<typename FunctionTraits<Callable>::ReturnType>::value, QVariant>
+{
+ return QVariant::fromValue(c(std::forward<Args>(args)...));
+}
+