aboutsummaryrefslogtreecommitdiff
path: root/src/base
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2022-10-02 02:44:53 +0200
committerLinus Jahn <lnj@kaidan.im>2022-10-02 23:01:13 +0200
commit6e7ac053693acb454db63aac22266386782205c9 (patch)
treefb43a3b04543ac57ca1f3ce9847b8aaca7b68f66 /src/base
parent9ea4dc9cb762f8108b47124250e0c9e76a5b2cde (diff)
downloadqxmpp-6e7ac053693acb454db63aac22266386782205c9.tar.gz
FutureUtils: Add visitForward() function
Diffstat (limited to 'src/base')
-rw-r--r--src/base/QXmppFutureUtils_p.h15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/base/QXmppFutureUtils_p.h b/src/base/QXmppFutureUtils_p.h
index 1be0f8fa..d69ec7fd 100644
--- a/src/base/QXmppFutureUtils_p.h
+++ b/src/base/QXmppFutureUtils_p.h
@@ -36,6 +36,21 @@ struct overloaded : Ts...
template<class... Ts>
overloaded(Ts...) -> overloaded<Ts...>;
+// Variation of std::visit allowing to forward unhandled types
+template<typename ReturnType, typename T, typename Visitor>
+auto visitForward(T variant, Visitor visitor)
+{
+ return std::visit([&](auto &&value) -> ReturnType {
+ using ValueType = std::decay_t<decltype(value)>;
+ if constexpr (std::is_invocable_v<Visitor, ValueType>) {
+ return visitor(std::move(value));
+ } else {
+ return value;
+ }
+ },
+ std::forward<T>(variant));
+}
+
template<typename F, typename Ret, typename A, typename... Rest>
A lambda_helper(Ret (F::*)(A, Rest...));