userver
C++ Async Framework
Toggle main menu visibility
Loading...
Searching...
No Matches
overloaded.hpp
Go to the documentation of this file.
1
#
pragma
once
2
3
/// @file userver/utils/overloaded.hpp
4
/// @brief @copybrief utils::Overloaded
5
6
#
include
<
variant
>
7
8
USERVER_NAMESPACE_BEGIN
9
10
namespace
utils
{
11
12
/// @ingroup userver_universal
13
///
14
/// @brief Utility to define std::variant visitors in a simple way
15
template
<
class
... Ts>
16
struct
Overloaded
: Ts... {
// NOLINT(fuchsia-multiple-inheritance)
17
using
Ts::operator()...;
18
};
19
20
template
<
class
... Ts>
21
Overloaded(Ts...) ->
Overloaded
<Ts...>;
22
23
template
<
class
... Args,
class
... Ts>
24
constexpr
decltype
(
auto
) Visit(
const
std::variant<Args...>& var, Ts&&... ts) {
25
return
std::visit(
Overloaded
{std::forward<Ts>(ts)...}, var);
26
}
27
28
template
<
class
... Args,
class
... Ts>
29
constexpr
decltype
(
auto
) Visit(std::variant<Args...>& var, Ts&&... ts) {
30
return
std::visit(
Overloaded
{std::forward<Ts>(ts)...}, var);
31
}
32
33
template
<
class
... Args,
class
... Ts>
34
constexpr
decltype
(
auto
) Visit(std::variant<Args...>&& var, Ts&&... ts) {
35
return
std::visit(
Overloaded
{std::forward<Ts>(ts)...}, std::move(var));
36
}
37
38
}
// namespace utils
39
40
USERVER_NAMESPACE_END
userver
utils
overloaded.hpp
Generated on
for userver by
Doxygen
1.17.0