Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qoverload.h
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#ifndef QOVERLOAD_H
6#define QOVERLOAD_H
7
8#include <QtCore/qtconfigmacros.h>
9
10#if 0
11#pragma qt_class(QOverload)
12#endif
13
14QT_BEGIN_NAMESPACE
15
16#ifdef Q_QDOC
17// Just for documentation generation
18template<typename T>
19auto qOverload(T functionPointer);
20template<typename T>
21auto qConstOverload(T memberFunctionPointer);
22template<typename T>
23auto qNonConstOverload(T memberFunctionPointer);
24#else
25template <typename... Args>
26struct QNonConstOverload
27{
28 template <typename R, typename T>
29 constexpr auto operator()(R (T::*ptr)(Args...)) const noexcept -> decltype(ptr)
30 { return ptr; }
31
32 template <typename R, typename T>
33 static constexpr auto of(R (T::*ptr)(Args...)) noexcept -> decltype(ptr)
34 { return ptr; }
35};
36
37template <typename... Args>
39{
40 template <typename R, typename T>
41 constexpr auto operator()(R (T::*ptr)(Args...) const) const noexcept -> decltype(ptr)
42 { return ptr; }
43
44 template <typename R, typename T>
45 static constexpr auto of(R (T::*ptr)(Args...) const) noexcept -> decltype(ptr)
46 { return ptr; }
47};
48
49template <typename... Args>
51{
52 using QConstOverload<Args...>::of;
53 using QConstOverload<Args...>::operator();
54 using QNonConstOverload<Args...>::of;
55 using QNonConstOverload<Args...>::operator();
56
57 template <typename R>
58 constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
59 { return ptr; }
60
61 template <typename R>
62 static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
63 { return ptr; }
64};
65
66template <typename... Args> constexpr inline QOverload<Args...> qOverload = {};
67template <typename... Args> constexpr inline QConstOverload<Args...> qConstOverload = {};
68template <typename... Args> constexpr inline QNonConstOverload<Args...> qNonConstOverload = {};
69
70#endif // Q_QDOC
71
72#define QT_VA_ARGS_CHOOSE(_1, _2, _3, _4, _5, _6, _7, _8, _9, N, ...) N
73#define QT_VA_ARGS_EXPAND(...) __VA_ARGS__ // Needed for MSVC
74#define QT_VA_ARGS_COUNT(...) QT_VA_ARGS_EXPAND(QT_VA_ARGS_CHOOSE(__VA_ARGS__, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
75#define QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC) MACRO##_##ARGC
76#define QT_OVERLOADED_MACRO_IMP(MACRO, ARGC) QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC)
77#define QT_OVERLOADED_MACRO(MACRO, ...) QT_VA_ARGS_EXPAND(QT_OVERLOADED_MACRO_IMP(MACRO, QT_VA_ARGS_COUNT(__VA_ARGS__))(__VA_ARGS__))
78
79QT_END_NAMESPACE
80
81#endif /* QOVERLOAD_H */
constexpr QOverload< Args... > qOverload
Definition qoverload.h:66
#define QT_OVERLOADED_MACRO_IMP(MACRO, ARGC)
Definition qoverload.h:76
constexpr QConstOverload< Args... > qConstOverload
Definition qoverload.h:67
#define QT_VA_ARGS_CHOOSE(_1, _2, _3, _4, _5, _6, _7, _8, _9, N,...)
Definition qoverload.h:72
#define QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC)
Definition qoverload.h:75
constexpr QNonConstOverload< Args... > qNonConstOverload
Definition qoverload.h:68
#define QT_VA_ARGS_EXPAND(...)
Definition qoverload.h:73
#define QT_VA_ARGS_COUNT(...)
Definition qoverload.h:74
constexpr auto operator()(R(T::*ptr)(Args...) const) const noexcept -> decltype(ptr)
Definition qoverload.h:41
static constexpr auto of(R(T::*ptr)(Args...) const) noexcept -> decltype(ptr)
Definition qoverload.h:45
static constexpr auto of(R(*ptr)(Args...)) noexcept -> decltype(ptr)
Definition qoverload.h:62
constexpr auto operator()(R(*ptr)(Args...)) const noexcept -> decltype(ptr)
Definition qoverload.h:58