File indexing completed on 2026-07-26 09:20:36
0001
0002
0003
0004
0005 #ifndef QOVERLOAD_H
0006 #define QOVERLOAD_H
0007
0008 #include <QtCore/qtconfigmacros.h>
0009
0010 #if 0
0011 #pragma qt_class(QOverload)
0012 #endif
0013
0014 QT_BEGIN_NAMESPACE
0015
0016 #ifdef Q_QDOC
0017
0018 template<typename T>
0019 auto qOverload(T functionPointer);
0020 template<typename T>
0021 auto qConstOverload(T memberFunctionPointer);
0022 template<typename T>
0023 auto qNonConstOverload(T memberFunctionPointer);
0024 #else
0025 template <typename... Args>
0026 struct QNonConstOverload
0027 {
0028 template <typename R, typename T>
0029 constexpr auto operator()(R (T::*ptr)(Args...)) const noexcept -> decltype(ptr)
0030 { return ptr; }
0031
0032 template <typename R, typename T>
0033 static constexpr auto of(R (T::*ptr)(Args...)) noexcept -> decltype(ptr)
0034 { return ptr; }
0035 };
0036
0037 template <typename... Args>
0038 struct QConstOverload
0039 {
0040 template <typename R, typename T>
0041 constexpr auto operator()(R (T::*ptr)(Args...) const) const noexcept -> decltype(ptr)
0042 { return ptr; }
0043
0044 template <typename R, typename T>
0045 static constexpr auto of(R (T::*ptr)(Args...) const) noexcept -> decltype(ptr)
0046 { return ptr; }
0047 };
0048
0049 template <typename... Args>
0050 struct QOverload : QConstOverload<Args...>, QNonConstOverload<Args...>
0051 {
0052 using QConstOverload<Args...>::of;
0053 using QConstOverload<Args...>::operator();
0054 using QNonConstOverload<Args...>::of;
0055 using QNonConstOverload<Args...>::operator();
0056
0057 template <typename R>
0058 constexpr auto operator()(R (*ptr)(Args...)) const noexcept -> decltype(ptr)
0059 { return ptr; }
0060
0061 template <typename R>
0062 static constexpr auto of(R (*ptr)(Args...)) noexcept -> decltype(ptr)
0063 { return ptr; }
0064 };
0065
0066 template <typename... Args> constexpr inline QOverload<Args...> qOverload = {};
0067 template <typename... Args> constexpr inline QConstOverload<Args...> qConstOverload = {};
0068 template <typename... Args> constexpr inline QNonConstOverload<Args...> qNonConstOverload = {};
0069
0070 #endif
0071
0072 #define QT_VA_ARGS_CHOOSE(_1, _2, _3, _4, _5, _6, _7, _8, _9, N, ...) N
0073 #define QT_VA_ARGS_EXPAND(...) __VA_ARGS__
0074 #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))
0075 #define QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC) MACRO##_##ARGC
0076 #define QT_OVERLOADED_MACRO_IMP(MACRO, ARGC) QT_OVERLOADED_MACRO_EXPAND(MACRO, ARGC)
0077 #define QT_OVERLOADED_MACRO(MACRO, ...) QT_VA_ARGS_EXPAND(QT_OVERLOADED_MACRO_IMP(MACRO, QT_VA_ARGS_COUNT(__VA_ARGS__))(__VA_ARGS__))
0078
0079 QT_END_NAMESPACE
0080
0081 #endif