diff options
| author | Linus Jahn <lnj@kaidan.im> | 2022-10-02 02:44:53 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-10-02 23:01:13 +0200 |
| commit | 6e7ac053693acb454db63aac22266386782205c9 (patch) | |
| tree | fb43a3b04543ac57ca1f3ce9847b8aaca7b68f66 /src/base | |
| parent | 9ea4dc9cb762f8108b47124250e0c9e76a5b2cde (diff) | |
| download | qxmpp-6e7ac053693acb454db63aac22266386782205c9.tar.gz | |
FutureUtils: Add visitForward() function
Diffstat (limited to 'src/base')
| -rw-r--r-- | src/base/QXmppFutureUtils_p.h | 15 |
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...)); |
