12 #include <type_traits>
23 void disconnect(Object *
object);
26 using SlotList = std::list<BoundMethodBase *>;
28 void connect(BoundMethodBase *slot);
29 void disconnect(std::function<
bool(SlotList::iterator &)> match);
37 template<
typename... Args>
47 template<typename T, typename R, std::enable_if_t<std::is_base_of<Object, T>::value> * =
nullptr>
48 void connect(T *obj, R (T::*func)(Args...),
52 SignalBase::connect(
new BoundMethodMember<T, R, Args...>(obj,
object, func, type));
55 template<typename T, typename R, std::enable_if_t<!std::is_base_of<Object, T>::value> * =
nullptr>
57 template<
typename T,
typename R>
59 void connect(T *obj, R (T::*func)(Args...))
61 SignalBase::connect(
new BoundMethodMember<T, R, Args...>(obj,
nullptr, func));
65 template<
typename T,
typename Func,
66 std::enable_if_t<std::is_base_of<Object, T>::value
67 #if __cplusplus >= 201703L
68 && std::is_invocable_v<Func, Args...>
74 SignalBase::connect(
new BoundMethodFunctor<T, void, Func, Args...>(obj,
object, func, type));
77 template<
typename T,
typename Func,
78 std::enable_if_t<!std::is_base_of<Object, T>::value
79 #if __cplusplus >= 201703L
80 && std::is_invocable_v<Func, Args...>
84 template<
typename T,
typename Func>
88 SignalBase::connect(
new BoundMethodFunctor<T, void, Func, Args...>(obj,
nullptr, func));
94 SignalBase::connect(
new BoundMethodStatic<R, Args...>(func));
99 SignalBase::disconnect([]([[maybe_unused]] SlotList::iterator &iter) {
107 SignalBase::disconnect([obj](SlotList::iterator &iter) {
108 return (*iter)->match(obj);
112 template<
typename T,
typename R>
115 SignalBase::disconnect([obj, func](SlotList::iterator &iter) {
116 BoundMethodArgs<R, Args...> *slot =
117 static_cast<BoundMethodArgs<R, Args...
> *>(*iter);
119 if (!slot->match(obj))
128 return static_cast<BoundMethodMember<T, R, Args...
> *>(slot)->match(func);
135 SignalBase::disconnect([func](SlotList::iterator &iter) {
136 BoundMethodArgs<R, Args...> *slot =
137 static_cast<BoundMethodArgs<R, Args...
> *>(*iter);
139 if (!slot->match(
nullptr))
142 return static_cast<BoundMethodStatic<R, Args...
> *>(slot)->match(func);
152 for (BoundMethodBase *slot : slots())
153 static_cast<BoundMethodArgs<
void, Args...
> *>(slot)->activate(args...);