SimpleWindow
载入中...
搜索中...
未找到
Delegate.h
1#pragma once
2
3#include <cstdint>
4#include <cstdlib>
5#include <cstring>
6#include <memory>
7#include <stdexcept>
8#include <tuple>
9#include <type_traits>
10#include <typeindex>
11#include <vector>
12
13namespace sw
14{
15 // ICallable接口声明
16 template <typename>
17 struct ICallable;
18
19 // Delegate类声明
20 template <typename>
21 class Delegate;
22
23 /*================================================================================*/
24
28 template <typename TRet, typename... Args>
29 struct ICallable<TRet(Args...)> {
33 virtual ~ICallable() = default;
34
40 virtual TRet Invoke(Args... args) const = 0;
41
45 virtual ICallable *Clone() const = 0;
46
50 virtual std::type_index GetType() const = 0;
51
57 virtual bool Equals(const ICallable &other) const = 0;
58 };
59
60 /*================================================================================*/
61
65 template <typename T>
67 {
68 public:
73
77 using TSinglePtr = std::unique_ptr<TCallable>;
78
82 using TSharedList = std::vector<std::shared_ptr<TCallable>>;
83
84 private:
88 mutable union {
89 alignas(TSinglePtr) uint8_t _single[sizeof(TSinglePtr)];
90 alignas(TSharedList) uint8_t _list[sizeof(TSharedList)];
91 } _data = {};
92
96 enum : uint8_t {
97 STATE_NONE,
98 STATE_SINGLE,
99 STATE_LIST,
100 } _state = STATE_NONE;
101
102 public:
107 {
108 }
109
114 {
115 *this = other;
116 }
117
122 {
123 *this = std::move(other);
124 }
125
133 {
134 if (this == &other) {
135 return *this;
136 }
137
138 switch (other._state) {
139 case STATE_NONE: {
140 _Reset();
141 break;
142 }
143 case STATE_SINGLE: {
144 std::unique_ptr<TCallable> cloned(other._GetSingle()->Clone());
145 _Reset(STATE_SINGLE);
146 _GetSingle() = std::move(cloned);
147 break;
148 }
149 case STATE_LIST: {
150 TSharedList copied = other._GetList();
151 _Reset(STATE_LIST);
152 _GetList() = std::move(copied);
153 break;
154 }
155 }
156 return *this;
157 }
158
163 {
164 if (this == &other) {
165 return *this;
166 }
167
168 _Reset(other._state);
169
170 switch (other._state) {
171 case STATE_NONE: {
172 break;
173 }
174 case STATE_SINGLE: {
175 _GetSingle() = std::move(other._GetSingle());
176 other._Reset();
177 break;
178 }
179 case STATE_LIST: {
180 _GetList() = std::move(other._GetList());
181 other._Reset();
182 break;
183 }
184 }
185 return *this;
186 }
187
192 {
193 _Reset();
194 }
195
201 {
202 switch (_state) {
203 case STATE_SINGLE: {
204 return 1;
205 }
206 case STATE_LIST: {
207 return _GetList().size();
208 }
209 default: {
210 return 0;
211 }
212 }
213 }
214
220 {
221 return _state == STATE_NONE;
222 }
223
228 {
229 _Reset();
230 }
231
243 {
245
246 if (owned == nullptr) {
247 return;
248 }
249
250 switch (_state) {
251 case STATE_NONE: {
252 _Reset(STATE_SINGLE);
253 _GetSingle() = std::move(owned);
254 break;
255 }
256 case STATE_SINGLE: {
257 TSharedList list;
258 list.reserve(2);
259 std::shared_ptr<TCallable> incoming(std::move(owned));
260 std::shared_ptr<TCallable> current(std::move(_GetSingle()));
261 list.emplace_back(std::move(current));
262 list.emplace_back(std::move(incoming));
263 _Reset(STATE_LIST);
264 _GetList() = std::move(list);
265 break;
266 }
267 case STATE_LIST: {
268 std::shared_ptr<TCallable> sp(std::move(owned));
269 _GetList().emplace_back(std::move(sp));
270 break;
271 }
272 }
273 }
274
279 bool RemoveAt(size_t index) noexcept
280 {
281 switch (_state) {
282 case STATE_SINGLE: {
283 if (index != 0) {
284 return false;
285 } else {
286 _Reset();
287 return true;
288 }
289 }
290 case STATE_LIST: {
291 auto &list = _GetList();
292 if (index >= list.size()) {
293 return false;
294 }
295 list.erase(list.begin() + index);
296 if (list.empty()) {
297 _Reset();
298 }
299 // 注:LIST 仅剩 1 元素时不降级回 SINGLE。shared_ptr 无法转移给
300 // unique_ptr,强行 Clone 反而带来额外开销,保留 LIST 单元素状态
301 // 在功能与性能上都可接受。
302 return true;
303 }
304 default: {
305 return false;
306 }
307 }
308 }
309
314 TCallable *GetAt(size_t index) const noexcept
315 {
316 switch (_state) {
317 case STATE_SINGLE: {
318 return index == 0 ? _GetSingle().get() : nullptr;
319 }
320 case STATE_LIST: {
321 auto &list = _GetList();
322 return (index < list.size()) ? list[index].get() : nullptr;
323 }
324 default: {
325 return nullptr;
326 }
327 }
328 }
329
334 TCallable *operator[](size_t index) const noexcept
335 {
336 return GetAt(index);
337 }
338
339 private:
343 constexpr TSinglePtr &_GetSingle() const noexcept
344 {
345 return *reinterpret_cast<TSinglePtr *>(_data._single);
346 }
347
351 constexpr TSharedList &_GetList() const noexcept
352 {
353 return *reinterpret_cast<TSharedList *>(_data._list);
354 }
355
359 void _Reset() noexcept
360 {
361 switch (_state) {
362 case STATE_NONE: {
363 break;
364 }
365 case STATE_SINGLE: {
366 _GetSingle().~TSinglePtr();
367 _state = STATE_NONE;
368 break;
369 }
370 case STATE_LIST: {
371 _GetList().~TSharedList();
372 _state = STATE_NONE;
373 break;
374 }
375 }
376 }
377
381 void _Reset(uint8_t state) noexcept
382 {
383 _Reset();
384
385 switch (state) {
386 case STATE_SINGLE: {
387 new (_data._single) TSinglePtr();
388 _state = STATE_SINGLE;
389 break;
390 }
391 case STATE_LIST: {
392 new (_data._list) TSharedList();
393 _state = STATE_LIST;
394 break;
395 }
396 }
397 }
398 };
399
400 /*================================================================================*/
401
405 template <typename TRet, typename... Args>
406 class Delegate<TRet(Args...)> final : public ICallable<TRet(Args...)>
407 {
408 private:
409 using _ICallable = ICallable<TRet(Args...)>;
410
411 template <typename T, typename = void>
412 struct _IsEqualityComparable : std::false_type {
413 };
414
415 template <typename T>
417 T, decltype(void(std::declval<T>() == std::declval<T>()))> : std::true_type {
418 };
419
420 template <typename T, typename = void>
421 struct _IsMemcmpSafe : std::false_type {
422 };
423
424 template <typename T>
425 struct _IsMemcmpSafe<
426 T,
427 typename std::enable_if</*std::is_trivial<T>::value &&*/ std::is_standard_layout<T>::value, void>::type> : std::true_type {
428 };
429
430 template <typename T>
431 class _CallableWrapperImpl final : public _ICallable
432 {
433 alignas(T) mutable uint8_t _storage[sizeof(T)];
434
435 public:
436 _CallableWrapperImpl(const T &value)
437 {
438 memset(_storage, 0, sizeof(_storage));
439 new (_storage) T(value);
440 }
441 _CallableWrapperImpl(T &&value)
442 {
443 memset(_storage, 0, sizeof(_storage));
444 new (_storage) T(std::move(value));
445 }
446 virtual ~_CallableWrapperImpl()
447 {
448 GetValue().~T();
449 // memset(_storage, 0, sizeof(_storage));
450 }
451 T &GetValue() const noexcept
452 {
453 return *reinterpret_cast<T *>(_storage);
454 }
455 TRet Invoke(Args... args) const override
456 {
457 return GetValue()(std::forward<Args>(args)...);
458 }
459 _ICallable *Clone() const override
460 {
461 return new _CallableWrapperImpl(GetValue());
462 }
463 virtual std::type_index GetType() const override
464 {
465 return typeid(T);
466 }
467 bool Equals(const _ICallable &other) const override
468 {
469 return EqualsImpl(other);
470 }
471 template <typename U = T>
472 auto EqualsImpl(const _ICallable &other) const
473 -> typename std::enable_if<_IsEqualityComparable<U>::value, bool>::type
474 {
475 if (this == &other) {
476 return true;
477 }
478 if (GetType() != other.GetType()) {
479 return false;
480 }
481 const auto &otherWrapper = static_cast<const _CallableWrapperImpl &>(other);
482 return GetValue() == otherWrapper.GetValue();
483 }
484 template <typename U = T>
485 auto EqualsImpl(const _ICallable &other) const
486 -> typename std::enable_if<!_IsEqualityComparable<U>::value && _IsMemcmpSafe<U>::value, bool>::type
487 {
488 if (this == &other) {
489 return true;
490 }
491 if (GetType() != other.GetType()) {
492 return false;
493 }
494 const auto &otherWrapper = static_cast<const _CallableWrapperImpl &>(other);
495 return memcmp(_storage, otherWrapper._storage, sizeof(_storage)) == 0;
496 }
497 template <typename U = T>
498 auto EqualsImpl(const _ICallable &other) const
499 -> typename std::enable_if<!_IsEqualityComparable<U>::value && !_IsMemcmpSafe<U>::value, bool>::type
500 {
501 return this == &other;
502 }
503
504 public:
505 // 禁用拷贝/移动:默认实现会按字节拷贝 _storage,不会调用 T 的构造函数,
506 // 对非平凡可拷贝类型会破坏不变式。需要克隆请走 Clone()。
507 _CallableWrapperImpl(const _CallableWrapperImpl &) = delete;
508 _CallableWrapperImpl(_CallableWrapperImpl &&) = delete;
509 _CallableWrapperImpl &operator=(const _CallableWrapperImpl &) = delete;
510 _CallableWrapperImpl &operator=(_CallableWrapperImpl &&) = delete;
511 };
512
513 template <typename T>
515
516 template <typename T>
517 class _MemberFuncWrapper final : public _ICallable
518 {
519 T *obj;
520 TRet (T::*func)(Args...);
521
522 public:
523 _MemberFuncWrapper(T &obj, TRet (T::*func)(Args...))
524 : obj(&obj), func(func)
525 {
526 }
527 TRet Invoke(Args... args) const override
528 {
529 return (obj->*func)(std::forward<Args>(args)...);
530 }
531 _ICallable *Clone() const override
532 {
533 return new _MemberFuncWrapper(*obj, func);
534 }
535 virtual std::type_index GetType() const override
536 {
537 return typeid(func);
538 }
539 bool Equals(const _ICallable &other) const override
540 {
541 if (this == &other) {
542 return true;
543 }
544 if (GetType() != other.GetType()) {
545 return false;
546 }
547 const auto &otherWrapper = static_cast<const _MemberFuncWrapper &>(other);
548 return obj == otherWrapper.obj && func == otherWrapper.func;
549 }
550
551 public:
552 // 禁用拷贝/移动:与 _CallableWrapperImpl 保持一致,需要克隆请走 Clone()。
553 _MemberFuncWrapper(const _MemberFuncWrapper &) = delete;
554 _MemberFuncWrapper(_MemberFuncWrapper &&) = delete;
555 _MemberFuncWrapper &operator=(const _MemberFuncWrapper &) = delete;
556 _MemberFuncWrapper &operator=(_MemberFuncWrapper &&) = delete;
557 };
558
559 template <typename T>
560 class _ConstMemberFuncWrapper final : public _ICallable
561 {
562 const T *obj;
563 TRet (T::*func)(Args...) const;
564
565 public:
566 _ConstMemberFuncWrapper(const T &obj, TRet (T::*func)(Args...) const)
567 : obj(&obj), func(func)
568 {
569 }
570 TRet Invoke(Args... args) const override
571 {
572 return (obj->*func)(std::forward<Args>(args)...);
573 }
574 _ICallable *Clone() const override
575 {
576 return new _ConstMemberFuncWrapper(*obj, func);
577 }
578 virtual std::type_index GetType() const override
579 {
580 return typeid(func);
581 }
582 bool Equals(const _ICallable &other) const override
583 {
584 if (this == &other) {
585 return true;
586 }
587 if (GetType() != other.GetType()) {
588 return false;
589 }
590 const auto &otherWrapper = static_cast<const _ConstMemberFuncWrapper &>(other);
591 return obj == otherWrapper.obj && func == otherWrapper.func;
592 }
593
594 public:
595 // 禁用拷贝/移动:与 _CallableWrapperImpl 保持一致,需要克隆请走 Clone()。
596 _ConstMemberFuncWrapper(const _ConstMemberFuncWrapper &) = delete;
597 _ConstMemberFuncWrapper(_ConstMemberFuncWrapper &&) = delete;
598 _ConstMemberFuncWrapper &operator=(const _ConstMemberFuncWrapper &) = delete;
599 _ConstMemberFuncWrapper &operator=(_ConstMemberFuncWrapper &&) = delete;
600 };
601
602 private:
606 CallableList<TRet(Args...)> _data;
607
608 public:
612 Delegate(std::nullptr_t = nullptr)
613 {
614 }
615
619 Delegate(const ICallable<TRet(Args...)> &callable)
620 {
621 Add(callable);
622 }
623
627 Delegate(TRet (*func)(Args...))
628 {
629 Add(func);
630 }
631
637 {
638 Add(callable);
639 }
640
644 template <typename T>
645 Delegate(T &obj, TRet (T::*func)(Args...))
646 {
647 Add(obj, func);
648 }
649
653 template <typename T>
654 Delegate(const T &obj, TRet (T::*func)(Args...) const)
655 {
656 Add(obj, func);
657 }
658
663 {
664 for (size_t i = 0; i < other._data.Count(); ++i) {
665 _data.Add(other._data[i]->Clone());
666 }
667 }
668
673 : _data(std::move(other._data))
674 {
675 }
676
681 {
682 if (this == &other) {
683 return *this;
684 }
685
686 CallableList<TRet(Args...)> copied;
687
688 for (size_t i = 0; i < other._data.Count(); ++i) {
689 copied.Add(other._data[i]->Clone());
690 }
691 _data = std::move(copied);
692 return *this;
693 }
694
699 {
700 if (this != &other) {
701 _data = std::move(other._data);
702 }
703 return *this;
704 }
705
717 void Add(const ICallable<TRet(Args...)> &callable)
718 {
719 if (callable.GetType() == GetType()) {
720 auto &delegate = static_cast<const Delegate &>(callable);
721 if (delegate._data.IsEmpty()) {
722 return;
723 } else if (delegate._data.Count() == 1) {
724 _data.Add(delegate._data[0]->Clone());
725 return;
726 }
727 }
728 _data.Add(callable.Clone());
729 }
730
734 void Add(TRet (*func)(Args...))
735 {
736 if (func != nullptr) {
737 _data.Add(new _CallableWrapper<decltype(func)>(func));
738 }
739 }
740
744 template <typename T>
745 auto Add(const T &callable)
746 -> typename std::enable_if<!std::is_base_of<_ICallable, T>::value, void>::type
747 {
748 _data.Add(new _CallableWrapper<T>(callable));
749 }
750
754 template <typename T>
755 void Add(T &obj, TRet (T::*func)(Args...))
756 {
757 _data.Add(new _MemberFuncWrapper<T>(obj, func));
758 }
759
763 template <typename T>
764 void Add(const T &obj, TRet (T::*func)(Args...) const)
765 {
766 _data.Add(new _ConstMemberFuncWrapper<T>(obj, func));
767 }
768
772 void Clear()
773 {
774 _data.Clear();
775 }
776
787 bool Remove(const ICallable<TRet(Args...)> &callable)
788 {
789 if (callable.GetType() == GetType()) {
790 auto &delegate = static_cast<const Delegate &>(callable);
791 if (delegate._data.IsEmpty()) {
792 return false;
793 } else if (delegate._data.Count() == 1) {
794 return _Remove(*delegate._data[0]);
795 }
796 }
797 return _Remove(callable);
798 }
799
805 bool Remove(TRet (*func)(Args...))
806 {
807 if (func == nullptr) {
808 return false;
809 }
810 return _Remove(_CallableWrapper<decltype(func)>(func));
811 }
812
818 template <typename T>
819 auto Remove(const T &callable)
820 -> typename std::enable_if<!std::is_base_of<_ICallable, T>::value, bool>::type
821 {
822 return _Remove(_CallableWrapper<T>(callable));
823 }
824
830 template <typename T>
831 bool Remove(T &obj, TRet (T::*func)(Args...))
832 {
833 return _Remove(_MemberFuncWrapper<T>(obj, func));
834 }
835
841 template <typename T>
842 bool Remove(const T &obj, TRet (T::*func)(Args...) const)
843 {
844 return _Remove(_ConstMemberFuncWrapper<T>(obj, func));
845 }
846
853 TRet operator()(Args... args) const
854 {
855 return _InvokeImpl(std::forward<Args>(args)...);
856 }
857
863 bool operator==(const Delegate &other) const
864 {
865 return Equals(other);
866 }
867
873 bool operator!=(const Delegate &other) const
874 {
875 return !Equals(other);
876 }
877
882 bool operator==(std::nullptr_t) const noexcept
883 {
884 return _data.IsEmpty();
885 }
886
891 bool operator!=(std::nullptr_t) const noexcept
892 {
893 return !_data.IsEmpty();
894 }
895
900 explicit operator bool() const noexcept
901 {
902 return !_data.IsEmpty();
903 }
904
910 {
911 Add(callable);
912 return *this;
913 }
914
919 Delegate &operator+=(TRet (*func)(Args...))
920 {
921 Add(func);
922 return *this;
923 }
924
929 template <typename T>
930 auto operator+=(const T &callable)
931 -> typename std::enable_if<!std::is_base_of<_ICallable, T>::value, Delegate &>::type
932 {
933 Add(callable);
934 return *this;
935 }
936
942 {
944 return *this;
945 }
946
951 Delegate &operator-=(TRet (*func)(Args...))
952 {
953 Remove(func);
954 return *this;
955 }
956
961 template <typename T>
962 auto operator-=(const T &callable)
963 -> typename std::enable_if<!std::is_base_of<_ICallable, T>::value, Delegate &>::type
964 {
966 return *this;
967 }
968
975 virtual TRet Invoke(Args... args) const override
976 {
977 return _InvokeImpl(std::forward<Args>(args)...);
978 }
979
984 virtual ICallable<TRet(Args...)> *Clone() const override
985 {
986 return new Delegate(*this);
987 }
988
993 virtual std::type_index GetType() const override
994 {
995 return typeid(Delegate<TRet(Args...)>);
996 }
997
1003 virtual bool Equals(const ICallable<TRet(Args...)> &other) const override
1004 {
1005 if (this == &other) {
1006 return true;
1007 }
1008 if (GetType() != other.GetType()) {
1009 return false;
1010 }
1011 const auto &otherDelegate = static_cast<const Delegate &>(other);
1012 if (_data.Count() != otherDelegate._data.Count()) {
1013 return false;
1014 }
1015 for (size_t i = _data.Count(); i > 0; --i) {
1016 if (!_data[i - 1]->Equals(*otherDelegate._data[i - 1])) {
1017 return false;
1018 }
1019 }
1020 return true;
1021 }
1022
1030 template <typename U = TRet>
1031 auto InvokeAll(Args... args) const
1032 -> typename std::enable_if<!std::is_void<U>::value, std::vector<U>>::type
1033 {
1034 std::vector<U> results;
1035 size_t count = _data.Count();
1036 if (count == 0) {
1037 _ThrowEmptyDelegateError();
1038 } else if (count == 1) {
1039 results.emplace_back(_data[0]->Invoke(std::forward<Args>(args)...));
1040 } else {
1041 auto list = _data;
1042 results.reserve(count);
1043 for (size_t i = 0; i + 1 < count; ++i) {
1044 results.emplace_back(list[i]->Invoke(args...));
1045 }
1046 results.emplace_back(list[count - 1]->Invoke(std::forward<Args>(args)...));
1047 }
1048 return results;
1049 }
1050
1051 private:
1055 bool _Remove(const _ICallable &callable)
1056 {
1057 for (size_t i = _data.Count(); i > 0; --i) {
1058 if (_data[i - 1]->Equals(callable)) {
1059 return _data.RemoveAt(i - 1);
1060 }
1061 }
1062 return false;
1063 }
1064
1068 [[noreturn]] void _ThrowEmptyDelegateError() const
1069 {
1070 throw std::runtime_error("Delegate is empty");
1071 }
1072
1078 inline TRet _InvokeImpl(Args... args) const
1079 {
1080 size_t count = _data.Count();
1081 if (count == 0) {
1082 _ThrowEmptyDelegateError();
1083 } else if (count == 1) {
1084 return _data[0]->Invoke(std::forward<Args>(args)...);
1085 } else {
1086 auto list = _data;
1087 for (size_t i = 0; i + 1 < count; ++i)
1088 list[i]->Invoke(args...);
1089 return list[count - 1]->Invoke(std::forward<Args>(args)...);
1090 }
1091 }
1092 };
1093
1094 /*================================================================================*/
1095
1100 template <typename TRet, typename... Args>
1101 inline bool operator==(std::nullptr_t, const Delegate<TRet(Args...)> &d) noexcept
1102 {
1103 return d == nullptr;
1104 }
1105
1110 template <typename TRet, typename... Args>
1111 inline bool operator!=(std::nullptr_t, const Delegate<TRet(Args...)> &d) noexcept
1112 {
1113 return d != nullptr;
1114 }
1115
1116 /*================================================================================*/
1117
1121 template <typename... Args>
1122 using Action = Delegate<void(Args...)>;
1123
1127 template <typename T>
1129
1130 /*================================================================================*/
1131
1135 template <typename...>
1137
1141 template <typename Last>
1143 using TRet = Last;
1144 using TArgsTuple = std::tuple<>;
1145 };
1146
1150 template <typename First, typename... Rest>
1151 struct _FuncTraits<First, Rest...> {
1152 using TRet = typename _FuncTraits<Rest...>::TRet;
1153 using TArgsTuple = decltype(std::tuple_cat(std::declval<std::tuple<First>>(), std::declval<typename _FuncTraits<Rest...>::TArgsTuple>()));
1154 };
1155
1159 template <typename TArgsTuple>
1161
1165 template <typename... Args>
1166 struct _FuncTypeHelper<std::tuple<Args...>> {
1167 template <typename TRet>
1168 using TFunc = Delegate<TRet(Args...)>;
1169 };
1170
1174 template <typename... Types>
1175 using Func = typename _FuncTypeHelper<typename _FuncTraits<Types...>::TArgsTuple>::template TFunc<typename _FuncTraits<Types...>::TRet>;
1176}
用于存储和管理多个可调用对象的列表,针对单个可调用对象的情况进行优化
Definition Delegate.h:67
CallableList(CallableList &&other) noexcept
移动构造函数
Definition Delegate.h:121
CallableList(const CallableList &other)
拷贝构造函数
Definition Delegate.h:113
CallableList()
默认构造函数
Definition Delegate.h:106
bool RemoveAt(size_t index) noexcept
移除指定索引处的可调用对象
Definition Delegate.h:279
std::unique_ptr< TCallable > TSinglePtr
智能指针类型别名,用于存储可调用对象的唯一指针
Definition Delegate.h:77
CallableList & operator=(const CallableList &other)
拷贝赋值运算
Definition Delegate.h:132
CallableList & operator=(CallableList &&other) noexcept
移动赋值运算
Definition Delegate.h:162
TCallable * operator[](size_t index) const noexcept
获取指定索引处的可调用对象
Definition Delegate.h:334
void Clear() noexcept
清空当前存储的可调用对象
Definition Delegate.h:227
TCallable * GetAt(size_t index) const noexcept
获取指定索引处的可调用对象
Definition Delegate.h:314
~CallableList()
析构函数
Definition Delegate.h:191
std::vector< std::shared_ptr< TCallable > > TSharedList
列表类型别名,用于存储多个可调用对象的智能指针
Definition Delegate.h:82
size_t Count() const noexcept
获取当前存储的可调用对象数量
Definition Delegate.h:200
bool IsEmpty() const noexcept
判断当前存储的可调用对象是否为空
Definition Delegate.h:219
void Add(TCallable *callable)
添加一个可调用对象到列表中
Definition Delegate.h:242
委托类,类似于C::中的委托,支持存储和调用任意可调用对象
Definition Delegate.h:407
Delegate(const T &obj, TRet(T::*func)(Args...) const)
构造函数,接受一个常量成员函数指针
Definition Delegate.h:654
void Add(TRet(*func)(Args...))
添加一个函数指针到委托中
Definition Delegate.h:734
void Add(const T &obj, TRet(T::*func)(Args...) const)
添加一个常量成员函数指针到委托中
Definition Delegate.h:764
Delegate & operator+=(TRet(*func)(Args...))
添加一个函数指针到委托中
Definition Delegate.h:919
Delegate(const Delegate &other)
拷贝构造函数
Definition Delegate.h:662
Delegate(std::nullptr_t=nullptr)
默认构造函数
Definition Delegate.h:612
auto InvokeAll(Args... args) const -> typename std::enable_if<!std::is_void< U >::value, std::vector< U > >::type
调用所有存储的可调用对象,并返回它们的结果
Definition Delegate.h:1031
Delegate & operator-=(TRet(*func)(Args...))
移除一个函数指针
Definition Delegate.h:951
Delegate(T &obj, TRet(T::*func)(Args...))
构造函数,接受一个成员函数指针
Definition Delegate.h:645
Delegate & operator=(Delegate &&other) noexcept
移动赋值运算符
Definition Delegate.h:698
virtual std::type_index GetType() const override
获取当前委托的类型信息
Definition Delegate.h:993
Delegate & operator=(const Delegate &other)
拷贝赋值运算符
Definition Delegate.h:680
Delegate(const T &callable)
构造函数,接受一个可调用对象
Definition Delegate.h:636
bool operator!=(const Delegate &other) const
判断当前委托是否不等于另一个委托
Definition Delegate.h:873
bool Remove(const ICallable< TRet(Args...)> &callable)
移除一个可调用对象
Definition Delegate.h:787
bool operator==(std::nullptr_t) const noexcept
判断当前委托是否等于nullptr
Definition Delegate.h:882
bool Remove(TRet(*func)(Args...))
移除一个函数指针
Definition Delegate.h:805
auto operator-=(const T &callable) -> typename std::enable_if<!std::is_base_of< _ICallable, T >::value, Delegate & >::type
移除一个可调用对象
Definition Delegate.h:962
virtual ICallable< TRet(Args...)> * Clone() const override
克隆当前委托
Definition Delegate.h:984
bool operator==(const Delegate &other) const
判断当前委托是否等于另一个委托
Definition Delegate.h:863
void Clear()
清空委托中的所有可调用对象
Definition Delegate.h:772
Delegate & operator+=(const ICallable< TRet(Args...)> &callable)
添加一个可调用对象到委托中
Definition Delegate.h:909
Delegate(Delegate &&other) noexcept
移动构造函数
Definition Delegate.h:672
auto operator+=(const T &callable) -> typename std::enable_if<!std::is_base_of< _ICallable, T >::value, Delegate & >::type
添加一个可调用对象到委托中
Definition Delegate.h:930
auto Remove(const T &callable) -> typename std::enable_if<!std::is_base_of< _ICallable, T >::value, bool >::type
移除一个可调用对象
Definition Delegate.h:819
virtual TRet Invoke(Args... args) const override
调用委托,执行所有存储的可调用对象
Definition Delegate.h:975
bool operator!=(std::nullptr_t) const noexcept
判断当前委托是否不等于nullptr
Definition Delegate.h:891
void Add(const ICallable< TRet(Args...)> &callable)
添加一个可调用对象到委托中
Definition Delegate.h:717
Delegate(TRet(*func)(Args...))
构造函数,接受一个函数指针
Definition Delegate.h:627
virtual bool Equals(const ICallable< TRet(Args...)> &other) const override
判断当前委托是否与另一个可调用对象相等
Definition Delegate.h:1003
bool Remove(const T &obj, TRet(T::*func)(Args...) const)
移除一个常量成员函数指针
Definition Delegate.h:842
Delegate & operator-=(const ICallable< TRet(Args...)> &callable)
移除一个可调用对象
Definition Delegate.h:941
auto Add(const T &callable) -> typename std::enable_if<!std::is_base_of< _ICallable, T >::value, void >::type
添加一个可调用对象到委托中
Definition Delegate.h:745
Delegate(const ICallable< TRet(Args...)> &callable)
构造函数,接受一个可调用对象
Definition Delegate.h:619
bool Remove(T &obj, TRet(T::*func)(Args...))
移除一个成员函数指针
Definition Delegate.h:831
void Add(T &obj, TRet(T::*func)(Args...))
添加一个成员函数指针到委托中
Definition Delegate.h:755
TRet operator()(Args... args) const
调用委托,执行所有存储的可调用对象
Definition Delegate.h:853
Definition Delegate.h:21
值转换器接口
Definition IValueConverter.h:14
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4
typename _FuncTypeHelper< typename _FuncTraits< Types... >::TArgsTuple >::template TFunc< typename _FuncTraits< Types... >::TRet > Func
Func类型别名,类似C::中的Func<T1, T2, ..., TResult>
Definition Delegate.h:1175
bool operator==(std::nullptr_t, const Delegate< TRet(Args...)> &d) noexcept
比较委托和nullptr
Definition Delegate.h:1101
bool operator!=(std::nullptr_t, const Delegate< TRet(Args...)> &d) noexcept
比较委托和nullptr
Definition Delegate.h:1111
ICallable接口,用于表示可调用对象的接口
Definition Delegate.h:29
virtual std::type_index GetType() const =0
获取当前可调用对象的类型信息
virtual ICallable * Clone() const =0
克隆当前可调用对象
virtual bool Equals(const ICallable &other) const =0
判断当前可调用对象是否与另一个可调用对象相等
virtual TRet Invoke(Args... args) const =0
调用函数
virtual ~ICallable()=default
析构函数
Definition Delegate.h:17
_FuncTraits模板,用于提取函数类型的返回值和参数类型
Definition Delegate.h:1136
_FuncTypeHelper模板,用于根据参数元组生成对应的Func类型
Definition Delegate.h:1160