11#define _SW_DEFINE_OPERATION_HELPER(NAME, OP) \
12 template <typename T, typename U, typename = void> \
13 struct NAME : std::false_type { \
15 template <typename T, typename U> \
16 struct NAME<T, U, decltype(void(std::declval<T>() OP std::declval<U>()))> : std::true_type { \
17 using type = decltype(std::declval<T>() OP std::declval<U>()); \
20#define _SW_DEFINE_UNARY_OPERATION_HELPER(NAME, OP) \
21 template <typename T, typename = void> \
22 struct NAME : std::false_type { \
24 template <typename T> \
25 struct NAME<T, decltype(void(OP std::declval<T>()))> : std::true_type { \
26 using type = decltype(OP std::declval<T>()); \
35 template <
typename T,
typename TDerived>
42 class ReadOnlyProperty;
45 class WriteOnlyProperty;
50 _SW_DEFINE_OPERATION_HELPER(_AddOperationHelper, +);
51 _SW_DEFINE_OPERATION_HELPER(_SubOperationHelper, -);
52 _SW_DEFINE_OPERATION_HELPER(_MulOperationHelper, *);
53 _SW_DEFINE_OPERATION_HELPER(_DivOperationHelper, /);
54 _SW_DEFINE_OPERATION_HELPER(_ModOperationHelper, %);
55 _SW_DEFINE_OPERATION_HELPER(_EqOperationHelper, ==);
56 _SW_DEFINE_OPERATION_HELPER(_NeOperationHelper, !=);
57 _SW_DEFINE_OPERATION_HELPER(_LtOperationHelper, <);
58 _SW_DEFINE_OPERATION_HELPER(_LeOperationHelper, <=);
59 _SW_DEFINE_OPERATION_HELPER(_GtOperationHelper, >);
60 _SW_DEFINE_OPERATION_HELPER(_GeOperationHelper, >=);
61 _SW_DEFINE_OPERATION_HELPER(_BitAndOperationHelper, &);
62 _SW_DEFINE_OPERATION_HELPER(_BitOrOperationHelper, |);
63 _SW_DEFINE_OPERATION_HELPER(_BitXorOperationHelper, ^);
64 _SW_DEFINE_OPERATION_HELPER(_ShlOperationHelper, <<);
65 _SW_DEFINE_OPERATION_HELPER(_ShrOperationHelper, >>);
66 _SW_DEFINE_OPERATION_HELPER(_LogicAndOperationHelper, &&);
67 _SW_DEFINE_OPERATION_HELPER(_LogicOrOperationHelper, ||);
68 _SW_DEFINE_UNARY_OPERATION_HELPER(_LogicNotOperationHelper, !);
69 _SW_DEFINE_UNARY_OPERATION_HELPER(_BitNotOperationHelper, ~);
70 _SW_DEFINE_UNARY_OPERATION_HELPER(_DerefOperationHelper, *);
71 _SW_DEFINE_UNARY_OPERATION_HELPER(_AddrOperationHelper, &);
72 _SW_DEFINE_UNARY_OPERATION_HELPER(_UnaryPlusOperationHelper, +);
73 _SW_DEFINE_UNARY_OPERATION_HELPER(_UnaryMinusOperationHelper, -);
83 template <
typename U,
typename V>
85 static std::false_type test(...);
88 using type =
decltype(test(std::declval<T *>()));
101 template <
typename,
typename =
void>
108 template <
typename T>
116 template <
typename,
typename =
void>
123 template <
typename T>
131 template <
typename T>
133 : std::integral_constant<bool, _IsProperty<T>::value && _HasGetterImpl<T>::value> {
139 template <
typename T>
141 : std::integral_constant<bool, _IsProperty<T>::value && _HasSetterImpl<T>::value> {
147 template <
typename T,
typename U,
typename =
void>
154 template <
typename T,
typename U>
157 using type =
decltype(std::declval<T>()[std::declval<U>()]);
163 template <
typename T,
typename =
void>
170 template <
typename T>
173 using type =
decltype(std::declval<T>().operator->());
179 template <
typename T>
187 template <
typename T>
197 template <
typename...
Args>
206 template <
typename U = T>
207 typename std::enable_if<std::is_pointer<U>::value, U>::type
operator->()
215 template <
typename U = T>
224 template <
typename U = T>
227 return this->value.operator->();
234 template <
typename TOwner,
typename TValue>
250 TValue (*_getter)(
TOwner *);
287 template <TValue (TOwner::*getter)()>
299 template <TValue (TOwner::*getter)() const>
311 template <
void (TOwner::*setter)(_PropertySetterParamType<TValue>)>
323 template <
void (TOwner::*setter)(_PropertySetterParamType<TValue>) const>
335 template <TValue TOwner::*field>
347 template <TValue TOwner::*field>
360 template <
typename TValue>
411 template <
typename T,
typename TDerived>
444 return static_cast<const TDerived *
>(
this)->GetterImpl();
452 static_cast<const TDerived *
>(
this)->SetterImpl(value);
476 typename =
typename std::enable_if<!std::is_arithmetic<T>::value && std::is_convertible<T, U>::value, U>::type>
479 return static_cast<U
>(this->
Get());
487 typename =
typename std::enable_if<!std::is_arithmetic<T>::value && !std::is_convertible<T, U>::value, U>::type,
489 explicit operator U()
const
491 return static_cast<U
>(this->
Get());
500 return *
static_cast<TDerived *
>(
this);
509 return *
static_cast<const TDerived *
>(
this);
518 return *
static_cast<TDerived *
>(
this);
527 return *
static_cast<const TDerived *
>(
this);
533 template <
typename U>
535 ->
typename std::enable_if<_AddOperationHelper<T, U>::value,
TDerived &>::type
537 this->
Set(this->
Get() + std::forward<U>(value));
538 return *
static_cast<TDerived *
>(
this);
544 template <
typename U>
546 ->
typename std::enable_if<_AddOperationHelper<T, U>::value,
const TDerived &>::type
548 this->
Set(this->
Get() + std::forward<U>(value));
549 return *
static_cast<const TDerived *
>(
this);
555 template <
typename D,
typename U>
557 ->
typename std::enable_if<_AddOperationHelper<T, U>::value,
TDerived &>::type
560 return *
static_cast<TDerived *
>(
this);
566 template <
typename D,
typename U>
568 ->
typename std::enable_if<_AddOperationHelper<T, U>::value,
const TDerived &>::type
571 return *
static_cast<const TDerived *
>(
this);
577 template <
typename U>
579 ->
typename std::enable_if<_SubOperationHelper<T, U>::value,
TDerived &>::type
581 this->
Set(this->
Get() - std::forward<U>(value));
582 return *
static_cast<TDerived *
>(
this);
588 template <
typename U>
590 ->
typename std::enable_if<_SubOperationHelper<T, U>::value,
const TDerived &>::type
592 this->
Set(this->
Get() - std::forward<U>(value));
593 return *
static_cast<const TDerived *
>(
this);
599 template <
typename D,
typename U>
601 ->
typename std::enable_if<_SubOperationHelper<T, U>::value,
TDerived &>::type
604 return *
static_cast<TDerived *
>(
this);
610 template <
typename D,
typename U>
612 ->
typename std::enable_if<_SubOperationHelper<T, U>::value,
const TDerived &>::type
615 return *
static_cast<const TDerived *
>(
this);
621 template <
typename U>
623 ->
typename std::enable_if<_MulOperationHelper<T, U>::value,
TDerived &>::type
625 this->
Set(this->
Get() * std::forward<U>(value));
626 return *
static_cast<TDerived *
>(
this);
632 template <
typename U>
634 ->
typename std::enable_if<_MulOperationHelper<T, U>::value,
const TDerived &>::type
636 this->
Set(this->
Get() * std::forward<U>(value));
637 return *
static_cast<const TDerived *
>(
this);
643 template <
typename D,
typename U>
645 ->
typename std::enable_if<_MulOperationHelper<T, U>::value,
TDerived &>::type
648 return *
static_cast<TDerived *
>(
this);
654 template <
typename D,
typename U>
656 ->
typename std::enable_if<_MulOperationHelper<T, U>::value,
const TDerived &>::type
659 return *
static_cast<const TDerived *
>(
this);
665 template <
typename U>
667 ->
typename std::enable_if<_DivOperationHelper<T, U>::value,
TDerived &>::type
669 this->
Set(this->
Get() / std::forward<U>(value));
670 return *
static_cast<TDerived *
>(
this);
676 template <
typename U>
678 ->
typename std::enable_if<_DivOperationHelper<T, U>::value,
const TDerived &>::type
680 this->
Set(this->
Get() / std::forward<U>(value));
681 return *
static_cast<const TDerived *
>(
this);
687 template <
typename D,
typename U>
689 ->
typename std::enable_if<_DivOperationHelper<T, U>::value,
TDerived &>::type
692 return *
static_cast<TDerived *
>(
this);
698 template <
typename D,
typename U>
700 ->
typename std::enable_if<_DivOperationHelper<T, U>::value,
const TDerived &>::type
703 return *
static_cast<const TDerived *
>(
this);
709 template <
typename U = T>
711 ->
typename std::enable_if<_AddOperationHelper<U, int>::value,
TDerived &>::type
713 this->
Set(this->
Get() + 1);
714 return *
static_cast<TDerived *
>(
this);
720 template <
typename U = T>
724 this->
Set(this->
Get() + 1);
725 return *
static_cast<const TDerived *
>(
this);
731 template <
typename U = T>
733 ->
typename std::enable_if<_SubOperationHelper<U, int>::value,
TDerived &>::type
735 this->
Set(this->
Get() - 1);
736 return *
static_cast<TDerived *
>(
this);
742 template <
typename U = T>
746 this->
Set(this->
Get() - 1);
747 return *
static_cast<const TDerived *
>(
this);
753 template <
typename U = T>
755 ->
typename std::enable_if<_AddOperationHelper<U, int>::value, T>::type
758 this->
Set(oldval + 1);
765 template <
typename U = T>
767 ->
typename std::enable_if<_SubOperationHelper<U, int>::value, T>::type
770 this->
Set(oldval - 1);
777 template <
typename U>
779 ->
typename std::enable_if<_BitAndOperationHelper<T, U>::value,
TDerived &>::type
781 this->
Set(this->
Get() & std::forward<U>(value));
782 return *
static_cast<TDerived *
>(
this);
788 template <
typename U>
790 ->
typename std::enable_if<_BitAndOperationHelper<T, U>::value,
const TDerived &>::type
792 this->
Set(this->
Get() & std::forward<U>(value));
793 return *
static_cast<const TDerived *
>(
this);
799 template <
typename D,
typename U>
801 ->
typename std::enable_if<_BitAndOperationHelper<T, U>::value,
TDerived &>::type
804 return *
static_cast<TDerived *
>(
this);
810 template <
typename D,
typename U>
812 ->
typename std::enable_if<_BitAndOperationHelper<T, U>::value,
const TDerived &>::type
815 return *
static_cast<const TDerived *
>(
this);
821 template <
typename U>
823 ->
typename std::enable_if<_BitOrOperationHelper<T, U>::value,
TDerived &>::type
825 this->
Set(this->
Get() | std::forward<U>(value));
826 return *
static_cast<TDerived *
>(
this);
832 template <
typename U>
834 ->
typename std::enable_if<_BitOrOperationHelper<T, U>::value,
const TDerived &>::type
836 this->
Set(this->
Get() | std::forward<U>(value));
837 return *
static_cast<const TDerived *
>(
this);
843 template <
typename D,
typename U>
845 ->
typename std::enable_if<_BitOrOperationHelper<T, U>::value,
TDerived &>::type
848 return *
static_cast<TDerived *
>(
this);
854 template <
typename D,
typename U>
856 ->
typename std::enable_if<_BitOrOperationHelper<T, U>::value,
const TDerived &>::type
859 return *
static_cast<const TDerived *
>(
this);
865 template <
typename U>
867 ->
typename std::enable_if<_BitXorOperationHelper<T, U>::value,
TDerived &>::type
869 this->
Set(this->
Get() ^ std::forward<U>(value));
870 return *
static_cast<TDerived *
>(
this);
876 template <
typename U>
878 ->
typename std::enable_if<_BitXorOperationHelper<T, U>::value,
const TDerived &>::type
880 this->
Set(this->
Get() ^ std::forward<U>(value));
881 return *
static_cast<const TDerived *
>(
this);
887 template <
typename D,
typename U>
889 ->
typename std::enable_if<_BitXorOperationHelper<T, U>::value,
TDerived &>::type
892 return *
static_cast<TDerived *
>(
this);
898 template <
typename D,
typename U>
900 ->
typename std::enable_if<_BitXorOperationHelper<T, U>::value,
const TDerived &>::type
903 return *
static_cast<const TDerived *
>(
this);
909 template <
typename U>
911 ->
typename std::enable_if<_ShlOperationHelper<T, U>::value,
TDerived &>::type
913 this->
Set(this->
Get() << std::forward<U>(value));
914 return *
static_cast<TDerived *
>(
this);
920 template <
typename U>
922 ->
typename std::enable_if<_ShlOperationHelper<T, U>::value,
const TDerived &>::type
924 this->
Set(this->
Get() << std::forward<U>(value));
925 return *
static_cast<const TDerived *
>(
this);
931 template <
typename D,
typename U>
933 ->
typename std::enable_if<_ShlOperationHelper<T, U>::value,
TDerived &>::type
936 return *
static_cast<TDerived *
>(
this);
942 template <
typename D,
typename U>
944 ->
typename std::enable_if<_ShlOperationHelper<T, U>::value,
const TDerived &>::type
947 return *
static_cast<const TDerived *
>(
this);
953 template <
typename U>
955 ->
typename std::enable_if<_ShrOperationHelper<T, U>::value,
TDerived &>::type
957 this->
Set(this->
Get() >> std::forward<U>(value));
958 return *
static_cast<TDerived *
>(
this);
964 template <
typename U>
966 ->
typename std::enable_if<_ShrOperationHelper<T, U>::value,
const TDerived &>::type
968 this->
Set(this->
Get() >> std::forward<U>(value));
969 return *
static_cast<const TDerived *
>(
this);
975 template <
typename D,
typename U>
977 ->
typename std::enable_if<_ShrOperationHelper<T, U>::value,
TDerived &>::type
980 return *
static_cast<TDerived *
>(
this);
986 template <
typename D,
typename U>
988 ->
typename std::enable_if<_ShrOperationHelper<T, U>::value,
const TDerived &>::type
991 return *
static_cast<const TDerived *
>(
this);
997 template <
typename U = T>
1001 return !this->
Get();
1007 template <
typename U = T>
1011 return ~this->Get();
1017 template <
typename U = T>
1021 return *this->
Get();
1027 template <
typename U = T>
1031 return &this->
Get();
1037 template <
typename U = T>
1041 return +this->
Get();
1047 template <
typename U = T>
1051 return -this->
Get();
1057 template <
typename U>
1061 return this->
Get() + std::forward<U>(value);
1067 template <
typename D,
typename U>
1071 return this->
Get() +
prop.Get();
1077 template <
typename U>
1081 return this->
Get() - std::forward<U>(value);
1087 template <
typename D,
typename U>
1091 return this->
Get() -
prop.Get();
1097 template <
typename U>
1101 return this->
Get() * std::forward<U>(value);
1107 template <
typename D,
typename U>
1111 return this->
Get() *
prop.Get();
1117 template <
typename U>
1121 return this->
Get() / std::forward<U>(value);
1127 template <
typename D,
typename U>
1131 return this->
Get() /
prop.Get();
1137 template <
typename U>
1141 return this->
Get() % std::forward<U>(value);
1147 template <
typename D,
typename U>
1151 return this->
Get() %
prop.Get();
1157 template <
typename U>
1161 return this->
Get() == std::forward<U>(value);
1167 template <
typename D,
typename U>
1171 return this->
Get() ==
prop.Get();
1178 template <
typename U>
1182 return !(*
this == std::forward<U>(value));
1189 template <
typename D,
typename U>
1193 return !(*
this ==
prop);
1199 template <
typename U>
1203 return this->
Get() < std::forward<U>(value);
1209 template <
typename D,
typename U>
1213 return this->
Get() <
prop.Get();
1219 template <
typename U>
1223 return this->
Get() <= std::forward<U>(value);
1229 template <
typename D,
typename U>
1233 return this->
Get() <=
prop.Get();
1239 template <
typename U>
1243 return this->
Get() > std::forward<U>(value);
1249 template <
typename D,
typename U>
1253 return this->
Get() >
prop.Get();
1259 template <
typename U>
1263 return this->
Get() >= std::forward<U>(value);
1269 template <
typename D,
typename U>
1273 return this->
Get() >=
prop.Get();
1279 template <
typename U>
1283 return this->
Get() & std::forward<U>(value);
1289 template <
typename D,
typename U>
1293 return this->
Get() &
prop.Get();
1299 template <
typename U>
1303 return this->
Get() | std::forward<U>(value);
1309 template <
typename D,
typename U>
1313 return this->
Get() |
prop.Get();
1319 template <
typename U>
1323 return this->
Get() ^ std::forward<U>(value);
1329 template <
typename D,
typename U>
1333 return this->
Get() ^
prop.Get();
1339 template <
typename U>
1343 return this->
Get() << std::forward<U>(value);
1349 template <
typename D,
typename U>
1353 return this->
Get() <<
prop.Get();
1359 template <
typename U>
1363 return this->
Get() >> std::forward<U>(value);
1369 template <
typename D,
typename U>
1373 return this->
Get() >>
prop.Get();
1379 template <
typename U>
1383 return this->
Get() && std::forward<U>(value);
1389 template <
typename D,
typename U>
1393 return this->
Get() &&
prop.Get();
1399 template <
typename U>
1403 return this->
Get() || std::forward<U>(value);
1409 template <
typename D,
typename U>
1413 return this->
Get() ||
prop.Get();
1419 template <
typename U>
1421 ->
typename std::enable_if<
1423 !std::is_reference<typename _BracketOperationHelper<T, U>::type>::value,
1426 return this->
Get()[std::forward<U>(value)];
1432 template <
typename D,
typename U>
1434 ->
typename std::enable_if<
1436 !std::is_reference<typename _BracketOperationHelper<T, U>::type>::value,
1439 return this->
Get()[
prop.Get()];
1445 template <
typename U>
1447 ->
typename std::enable_if<
1451 return this->
Get()[std::forward<U>(value)];
1457 template <
typename D,
typename U>
1459 ->
typename std::enable_if<
1463 return this->
Get()[
prop.Get()];
1471 (std::numeric_limits<std::ptrdiff_t>::max)();
1491 if (
owner ==
nullptr) {
1514 template <
typename TOwner>
1534 template <
typename D,
typename T,
typename U>
1535 auto operator+(T &&left,
const PropertyBase<U, D> &right)
1536 ->
typename std::enable_if<!_IsProperty<T>::value && _AddOperationHelper<T, U>::value,
typename _AddOperationHelper<T, U>::type>::type
1538 return std::forward<T>(left) + right.Get();
1544 template <
typename D,
typename T,
typename U>
1545 auto operator-(T &&left,
const PropertyBase<U, D> &right)
1546 ->
typename std::enable_if<!_IsProperty<T>::value && _SubOperationHelper<T, U>::value,
typename _SubOperationHelper<T, U>::type>::type
1548 return std::forward<T>(left) - right.Get();
1554 template <
typename D,
typename T,
typename U>
1555 auto operator*(T &&left,
const PropertyBase<U, D> &right)
1556 ->
typename std::enable_if<!_IsProperty<T>::value && _MulOperationHelper<T, U>::value,
typename _MulOperationHelper<T, U>::type>::type
1558 return std::forward<T>(left) * right.Get();
1564 template <
typename D,
typename T,
typename U>
1565 auto operator/(T &&left,
const PropertyBase<U, D> &right)
1566 ->
typename std::enable_if<!_IsProperty<T>::value && _DivOperationHelper<T, U>::value,
typename _DivOperationHelper<T, U>::type>::type
1568 return std::forward<T>(left) / right.Get();
1574 template <
typename D,
typename T,
typename U>
1575 auto operator%(T &&left,
const PropertyBase<U, D> &right)
1576 ->
typename std::enable_if<!_IsProperty<T>::value && _ModOperationHelper<T, U>::value,
typename _ModOperationHelper<T, U>::type>::type
1578 return std::forward<T>(left) % right.Get();
1584 template <
typename D,
typename T,
typename U>
1585 auto operator==(T &&left,
const PropertyBase<U, D> &right)
1586 ->
typename std::enable_if<!_IsProperty<T>::value && _EqOperationHelper<T, U>::value,
typename _EqOperationHelper<T, U>::type>::type
1588 return std::forward<T>(left) == right.Get();
1595 template <
typename D,
typename T,
typename U>
1596 auto operator!=(T &&left,
const PropertyBase<U, D> &right)
1597 ->
typename std::enable_if<!_IsProperty<T>::value && _EqOperationHelper<T, U>::value,
typename _EqOperationHelper<T, U>::type>::type
1599 return !(std::forward<T>(left) == right);
1605 template <
typename D,
typename T,
typename U>
1606 auto operator<(T &&left,
const PropertyBase<U, D> &right)
1607 ->
typename std::enable_if<!_IsProperty<T>::value && _LtOperationHelper<T, U>::value,
typename _LtOperationHelper<T, U>::type>::type
1609 return std::forward<T>(left) < right.Get();
1615 template <
typename D,
typename T,
typename U>
1616 auto operator<=(T &&left,
const PropertyBase<U, D> &right)
1617 ->
typename std::enable_if<!_IsProperty<T>::value && _LeOperationHelper<T, U>::value,
typename _LeOperationHelper<T, U>::type>::type
1619 return std::forward<T>(left) <= right.Get();
1625 template <
typename D,
typename T,
typename U>
1626 auto operator>(T &&left,
const PropertyBase<U, D> &right)
1627 ->
typename std::enable_if<!_IsProperty<T>::value && _GtOperationHelper<T, U>::value,
typename _GtOperationHelper<T, U>::type>::type
1629 return std::forward<T>(left) > right.Get();
1635 template <
typename D,
typename T,
typename U>
1636 auto operator>=(T &&left,
const PropertyBase<U, D> &right)
1637 ->
typename std::enable_if<!_IsProperty<T>::value && _GeOperationHelper<T, U>::value,
typename _GeOperationHelper<T, U>::type>::type
1639 return std::forward<T>(left) >= right.Get();
1645 template <
typename D,
typename T,
typename U>
1646 auto operator&(T &&left,
const PropertyBase<U, D> &right)
1647 ->
typename std::enable_if<!_IsProperty<T>::value && _BitAndOperationHelper<T, U>::value,
typename _BitAndOperationHelper<T, U>::type>::type
1649 return std::forward<T>(left) & right.Get();
1655 template <
typename D,
typename T,
typename U>
1656 auto operator|(T &&left,
const PropertyBase<U, D> &right)
1657 ->
typename std::enable_if<!_IsProperty<T>::value && _BitOrOperationHelper<T, U>::value,
typename _BitOrOperationHelper<T, U>::type>::type
1659 return std::forward<T>(left) | right.Get();
1665 template <
typename D,
typename T,
typename U>
1666 auto operator^(T &&left,
const PropertyBase<U, D> &right)
1667 ->
typename std::enable_if<!_IsProperty<T>::value && _BitXorOperationHelper<T, U>::value,
typename _BitXorOperationHelper<T, U>::type>::type
1669 return std::forward<T>(left) ^ right.Get();
1675 template <
typename D,
typename T,
typename U>
1676 auto operator<<(T &&left,
const PropertyBase<U, D> &right)
1677 ->
typename std::enable_if<!_IsProperty<T>::value && _ShlOperationHelper<T, U>::value,
typename _ShlOperationHelper<T, U>::type>::type
1679 return std::forward<T>(left) << right.Get();
1685 template <
typename D,
typename T,
typename U>
1686 auto operator>>(T &&left,
const PropertyBase<U, D> &right)
1687 ->
typename std::enable_if<!_IsProperty<T>::value && _ShrOperationHelper<T, U>::value,
typename _ShrOperationHelper<T, U>::type>::type
1689 return std::forward<T>(left) >> right.Get();
1695 template <
typename D,
typename T,
typename U>
1696 auto operator&&(T &&left,
const PropertyBase<U, D> &right)
1697 ->
typename std::enable_if<!_IsProperty<T>::value && _LogicAndOperationHelper<T, U>::value,
typename _LogicAndOperationHelper<T, U>::type>::type
1699 return std::forward<T>(left) && right.Get();
1705 template <
typename D,
typename T,
typename U>
1706 auto operator||(T &&left,
const PropertyBase<U, D> &right)
1707 ->
typename std::enable_if<!_IsProperty<T>::value && _LogicOrOperationHelper<T, U>::value,
typename _LogicOrOperationHelper<T, U>::type>::type
1709 return std::forward<T>(left) || right.Get();
1717 template <
typename T>
1722 using TValue =
typename TBase::TValue;
1724 using TGetter = T (*)(
void *);
1744 using TBase::operator=;
1749 template <
typename TOwner>
1756 this->
SetOwner(initializer._owner);
1757 this->_getter =
reinterpret_cast<void *
>(
initializer._getter);
1758 this->_setter =
reinterpret_cast<void *
>(
initializer._setter);
1770 this->_getter =
reinterpret_cast<void *
>(
initializer._getter);
1771 this->_setter =
reinterpret_cast<void *
>(
initializer._setter);
1802 template <
typename T>
1807 using TValue =
typename TBase::TValue;
1809 using TGetter = T (*)(
void *);
1822 template <
typename TOwner>
1828 this->
SetOwner(initializer._owner);
1829 this->_getter =
reinterpret_cast<void *
>(
initializer._getter);
1840 this->_getter =
reinterpret_cast<void *
>(
initializer._getter);
1859 template <
typename T>
1864 using TValue =
typename TBase::TValue;
1879 using TBase::operator=;
1884 template <
typename TOwner>
1890 this->
SetOwner(initializer._owner);
1891 this->_setter =
reinterpret_cast<void *
>(
initializer._setter);
1902 this->_setter =
reinterpret_cast<void *
>(
initializer._setter);
1927#define _SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(T) \
1928 extern template class sw::Property<T>; \
1929 extern template class sw::ReadOnlyProperty<T>; \
1930 extern template class sw::WriteOnlyProperty<T>
1932#define _SW_DEFINE_EXTERN_PROPERTY_TEMPLATE(T) \
1933 template class sw::Property<T>; \
1934 template class sw::ReadOnlyProperty<T>; \
1935 template class sw::WriteOnlyProperty<T>
1937_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(
bool);
1938_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(
float);
1939_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(
double);
1940_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int8_t);
1941_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int16_t);
1942_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int32_t);
1943_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(int64_t);
1944_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint8_t);
1945_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint16_t);
1946_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint32_t);
1947_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(uint64_t);
1948_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(std::string);
1949_SW_DECLARE_EXTERN_PROPERTY_TEMPLATE(std::wstring);
值转换器接口
Definition IValueConverter.h:14
成员属性初始化器
Definition Property.h:236
MemberPropertyInitializer & Setter()
设置成员函数setter
Definition Property.h:312
MemberPropertyInitializer & Getter(TValue(*getter)(TOwner *))
设置getter
Definition Property.h:269
MemberPropertyInitializer(TOwner *owner)
构造成员属性初始化器
Definition Property.h:261
MemberPropertyInitializer & Setter(void(*setter)(TOwner *, _PropertySetterParamType< TValue >))
设置setter
Definition Property.h:278
MemberPropertyInitializer & Getter()
设置成员函数getter
Definition Property.h:288
属性基类模板
Definition Property.h:413
auto operator[](const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BracketOperationHelper< T, U >::value &&std::is_pointer< T >::value, typename _BracketOperationHelper< T, U >::type >::type
指针下标运算
Definition Property.h:1458
static StaticPropertyInitializer< T > Init()
获取静态属性初始化器
Definition Property.h:1523
auto operator[](U &&value) const -> typename std::enable_if< _BracketOperationHelper< T, U >::value &&std::is_pointer< T >::value, typename _BracketOperationHelper< T, U >::type >::type
指针下标运算
Definition Property.h:1446
auto operator==(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
等于运算
Definition Property.h:1168
void SetOwner(void *owner) noexcept
设置属性所有者对象,nullptr表示静态属性
Definition Property.h:1489
auto operator/=(U &&value) -> typename std::enable_if< _DivOperationHelper< T, U >::value, TDerived & >::type
除赋值运算
Definition Property.h:666
auto operator*() const -> typename std::enable_if< _DerefOperationHelper< U >::value, typename _DerefOperationHelper< U >::type >::type
解引用运算
Definition Property.h:1018
auto operator++(int) const -> typename std::enable_if< _AddOperationHelper< U, int >::value, T >::type
后置自增运算
Definition Property.h:754
auto operator>(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _GtOperationHelper< T, U >::value, typename _GtOperationHelper< T, U >::type >::type
大于运算
Definition Property.h:1250
auto operator>>(U &&value) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, typename _ShrOperationHelper< T, U >::type >::type
右移运算
Definition Property.h:1360
auto operator%(U &&value) const -> typename std::enable_if< _ModOperationHelper< T, U >::value, typename _ModOperationHelper< T, U >::type >::type
取模运算
Definition Property.h:1138
T Get() const
获取属性值
Definition Property.h:442
auto operator/=(U &&value) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, const TDerived & >::type
除赋值运算
Definition Property.h:677
auto operator>>=(U &&value) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, const TDerived & >::type
右移赋值运算
Definition Property.h:965
auto operator--(int) const -> typename std::enable_if< _SubOperationHelper< U, int >::value, T >::type
后置自减运算
Definition Property.h:766
auto operator||(U &&value) const -> typename std::enable_if< _LogicOrOperationHelper< T, U >::value, typename _LogicOrOperationHelper< T, U >::type >::type
逻辑或运算
Definition Property.h:1400
auto operator*(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, typename _MulOperationHelper< T, U >::type >::type
乘法运算
Definition Property.h:1108
auto operator<<=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, const TDerived & >::type
左移赋值运算
Definition Property.h:943
auto operator+(U &&value) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, typename _AddOperationHelper< T, U >::type >::type
加法运算
Definition Property.h:1058
auto operator^=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, const TDerived & >::type
按位异或赋值运算
Definition Property.h:899
auto operator&() const -> typename std::enable_if< _AddrOperationHelper< U >::value, typename _AddrOperationHelper< U >::type >::type
地址运算
Definition Property.h:1028
auto operator|(U &&value) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, typename _BitOrOperationHelper< T, U >::type >::type
按位或运算
Definition Property.h:1300
auto operator--() const -> typename std::enable_if< _SubOperationHelper< U, int >::value, const TDerived & >::type
前置自减运算
Definition Property.h:743
auto operator&=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, const TDerived & >::type
按位与赋值运算
Definition Property.h:811
auto operator<<(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, typename _ShlOperationHelper< T, U >::type >::type
左移运算
Definition Property.h:1350
auto operator|(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, typename _BitOrOperationHelper< T, U >::type >::type
按位或运算
Definition Property.h:1310
auto operator>=(U &&value) const -> typename std::enable_if< _GeOperationHelper< T, U >::value, typename _GeOperationHelper< T, U >::type >::type
大于等于运算
Definition Property.h:1260
auto operator+(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, typename _AddOperationHelper< T, U >::type >::type
加法运算
Definition Property.h:1068
auto operator/(U &&value) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, typename _DivOperationHelper< T, U >::type >::type
除法运算
Definition Property.h:1118
const TDerived & operator=(TSetterParam value) const
设置属性值
Definition Property.h:506
const TDerived & operator=(const PropertyBase &prop) const
设置属性值
Definition Property.h:524
auto operator[](const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BracketOperationHelper< T, U >::value &&!std::is_reference< typename _BracketOperationHelper< T, U >::type >::value, typename _BracketOperationHelper< T, U >::type >::type
下标运算
Definition Property.h:1433
auto operator/=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _DivOperationHelper< T, U >::value, TDerived & >::type
除赋值运算
Definition Property.h:688
auto operator!=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
不等于运算
Definition Property.h:1190
auto operator++() -> typename std::enable_if< _AddOperationHelper< U, int >::value, TDerived & >::type
前置自增运算
Definition Property.h:710
auto operator==(U &&value) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
等于运算
Definition Property.h:1158
auto operator|=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, TDerived & >::type
按位或赋值运算
Definition Property.h:844
auto operator+=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _AddOperationHelper< T, U >::value, TDerived & >::type
加赋值运算
Definition Property.h:556
std::ptrdiff_t _offset
所有者对象相对于当前属性对象的偏移量
Definition Property.h:1476
auto operator|=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, const TDerived & >::type
按位或赋值运算
Definition Property.h:855
auto operator&=(U &&value) -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, TDerived & >::type
按位与赋值运算
Definition Property.h:778
static constexpr std::ptrdiff_t _STATICOFFSET
静态属性偏移量标记
Definition Property.h:1470
auto operator<(U &&value) const -> typename std::enable_if< _LtOperationHelper< T, U >::value, typename _LtOperationHelper< T, U >::type >::type
小于运算
Definition Property.h:1200
auto operator-() const -> typename std::enable_if< _UnaryMinusOperationHelper< U >::value, typename _UnaryMinusOperationHelper< U >::type >::type
负号运算
Definition Property.h:1048
auto operator||(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _LogicOrOperationHelper< T, U >::value, typename _LogicOrOperationHelper< T, U >::type >::type
逻辑或运算
Definition Property.h:1410
auto operator-=(U &&value) -> typename std::enable_if< _SubOperationHelper< T, U >::value, TDerived & >::type
减赋值运算
Definition Property.h:578
auto operator-(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, typename _SubOperationHelper< T, U >::type >::type
减法运算
Definition Property.h:1088
TDerived & operator=(const PropertyBase &prop)
设置属性值
Definition Property.h:515
auto operator>(U &&value) const -> typename std::enable_if< _GtOperationHelper< T, U >::value, typename _GtOperationHelper< T, U >::type >::type
大于运算
Definition Property.h:1240
auto operator*(U &&value) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, typename _MulOperationHelper< T, U >::type >::type
乘法运算
Definition Property.h:1098
auto operator&=(U &&value) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, const TDerived & >::type
按位与赋值运算
Definition Property.h:789
auto operator--() -> typename std::enable_if< _SubOperationHelper< U, int >::value, TDerived & >::type
前置自减运算
Definition Property.h:732
auto operator<=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _LeOperationHelper< T, U >::value, typename _LeOperationHelper< T, U >::type >::type
小于等于运算
Definition Property.h:1230
auto operator>>=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, const TDerived & >::type
右移赋值运算
Definition Property.h:987
auto operator&(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, typename _BitAndOperationHelper< T, U >::type >::type
按位与运算
Definition Property.h:1290
auto operator&&(U &&value) const -> typename std::enable_if< _LogicAndOperationHelper< T, U >::value, typename _LogicAndOperationHelper< T, U >::type >::type
逻辑与运算
Definition Property.h:1380
auto operator~() const -> typename std::enable_if< _BitNotOperationHelper< U >::value, typename _BitNotOperationHelper< U >::type >::type
按位非运算
Definition Property.h:1008
static MemberPropertyInitializer< TOwner, T > Init(TOwner *owner)
获取成员属性初始化器
Definition Property.h:1515
auto operator-=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _SubOperationHelper< T, U >::value, TDerived & >::type
减赋值运算
Definition Property.h:600
auto operator-(U &&value) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, typename _SubOperationHelper< T, U >::type >::type
减法运算
Definition Property.h:1078
void Set(TSetterParam value) const
设置属性值
Definition Property.h:450
auto operator++() const -> typename std::enable_if< _AddOperationHelper< U, int >::value, const TDerived & >::type
前置自增运算
Definition Property.h:721
auto operator[](U &&value) const -> typename std::enable_if< _BracketOperationHelper< T, U >::value &&!std::is_reference< typename _BracketOperationHelper< T, U >::type >::value, typename _BracketOperationHelper< T, U >::type >::type
下标运算
Definition Property.h:1420
auto operator*=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, const TDerived & >::type
乘赋值运算
Definition Property.h:655
auto operator^=(U &&value) -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, TDerived & >::type
按位异或赋值运算
Definition Property.h:866
bool IsStatic() const noexcept
判断属性是否为静态属性
Definition Property.h:1481
auto operator^(U &&value) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, typename _BitXorOperationHelper< T, U >::type >::type
按位异或运算
Definition Property.h:1320
auto operator<<(U &&value) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, typename _ShlOperationHelper< T, U >::type >::type
左移运算
Definition Property.h:1340
auto operator<<=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _ShlOperationHelper< T, U >::value, TDerived & >::type
左移赋值运算
Definition Property.h:932
auto operator!=(U &&value) const -> typename std::enable_if< _EqOperationHelper< T, U >::value, typename _EqOperationHelper< T, U >::type >::type
不等于运算
Definition Property.h:1179
auto operator->() const
取属性字段
Definition Property.h:458
auto operator&&(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _LogicAndOperationHelper< T, U >::value, typename _LogicAndOperationHelper< T, U >::type >::type
逻辑与运算
Definition Property.h:1390
auto operator|=(U &&value) -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, TDerived & >::type
按位或赋值运算
Definition Property.h:822
auto operator<<=(U &&value) const -> typename std::enable_if< _ShlOperationHelper< T, U >::value, const TDerived & >::type
左移赋值运算
Definition Property.h:921
auto operator&=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, TDerived & >::type
按位与赋值运算
Definition Property.h:800
auto operator%(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ModOperationHelper< T, U >::value, typename _ModOperationHelper< T, U >::type >::type
取模运算
Definition Property.h:1148
auto operator+=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, const TDerived & >::type
加赋值运算
Definition Property.h:567
auto operator+=(U &&value) -> typename std::enable_if< _AddOperationHelper< T, U >::value, TDerived & >::type
加赋值运算
Definition Property.h:534
auto operator&(U &&value) const -> typename std::enable_if< _BitAndOperationHelper< T, U >::value, typename _BitAndOperationHelper< T, U >::type >::type
按位与运算
Definition Property.h:1280
auto operator|=(U &&value) const -> typename std::enable_if< _BitOrOperationHelper< T, U >::value, const TDerived & >::type
按位或赋值运算
Definition Property.h:833
auto operator<<=(U &&value) -> typename std::enable_if< _ShlOperationHelper< T, U >::value, TDerived & >::type
左移赋值运算
Definition Property.h:910
auto operator+=(U &&value) const -> typename std::enable_if< _AddOperationHelper< T, U >::value, const TDerived & >::type
加赋值运算
Definition Property.h:545
auto operator-=(U &&value) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, const TDerived & >::type
减赋值运算
Definition Property.h:589
FieldsAccessor< T > AccessFields() const
访问属性字段,可由子类重写
Definition Property.h:434
auto operator<=(U &&value) const -> typename std::enable_if< _LeOperationHelper< T, U >::value, typename _LeOperationHelper< T, U >::type >::type
小于等于运算
Definition Property.h:1220
auto operator>>=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _ShrOperationHelper< T, U >::value, TDerived & >::type
右移赋值运算
Definition Property.h:976
auto operator!() const -> typename std::enable_if< _LogicNotOperationHelper< U >::value, typename _LogicNotOperationHelper< U >::type >::type
逻辑非运算
Definition Property.h:998
auto operator*=(U &&value) -> typename std::enable_if< _MulOperationHelper< T, U >::value, TDerived & >::type
乘赋值运算
Definition Property.h:622
void * GetOwner() const noexcept
获取属性所有者对象,当属性为静态属性时返回nullptr
Definition Property.h:1501
auto operator>>=(U &&value) -> typename std::enable_if< _ShrOperationHelper< T, U >::value, TDerived & >::type
右移赋值运算
Definition Property.h:954
auto operator^=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, TDerived & >::type
按位异或赋值运算
Definition Property.h:888
TDerived & operator=(TSetterParam value)
设置属性值
Definition Property.h:497
auto operator-=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _SubOperationHelper< T, U >::value, const TDerived & >::type
减赋值运算
Definition Property.h:611
auto operator/=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, const TDerived & >::type
除赋值运算
Definition Property.h:699
auto operator*=(U &&value) const -> typename std::enable_if< _MulOperationHelper< T, U >::value, const TDerived & >::type
乘赋值运算
Definition Property.h:633
auto operator/(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _DivOperationHelper< T, U >::value, typename _DivOperationHelper< T, U >::type >::type
除法运算
Definition Property.h:1128
auto operator^(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, typename _BitXorOperationHelper< T, U >::type >::type
按位异或运算
Definition Property.h:1330
auto operator*=(const PropertyBase< U, D > &prop) -> typename std::enable_if< _MulOperationHelper< T, U >::value, TDerived & >::type
乘赋值运算
Definition Property.h:644
auto operator>>(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _ShrOperationHelper< T, U >::value, typename _ShrOperationHelper< T, U >::type >::type
右移运算
Definition Property.h:1370
auto operator+() const -> typename std::enable_if< _UnaryPlusOperationHelper< U >::value, typename _UnaryPlusOperationHelper< U >::type >::type
正号运算
Definition Property.h:1038
auto operator<(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _LtOperationHelper< T, U >::value, typename _LtOperationHelper< T, U >::type >::type
小于运算
Definition Property.h:1210
auto operator^=(U &&value) const -> typename std::enable_if< _BitXorOperationHelper< T, U >::value, const TDerived & >::type
按位异或赋值运算
Definition Property.h:877
auto operator>=(const PropertyBase< U, D > &prop) const -> typename std::enable_if< _GeOperationHelper< T, U >::value, typename _GeOperationHelper< T, U >::type >::type
大于等于运算
Definition Property.h:1270
属性
Definition Property.h:1719
T GetterImpl() const
获取属性值
Definition Property.h:1777
void SetterImpl(TSetterParam value) const
设置属性值
Definition Property.h:1789
Property(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1750
Property(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1764
只读属性
Definition Property.h:1804
ReadOnlyProperty(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1835
ReadOnlyProperty(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1823
T GetterImpl() const
获取属性值
Definition Property.h:1846
静态属性初始化器
Definition Property.h:362
StaticPropertyInitializer()
构造静态属性初始化器
Definition Property.h:382
StaticPropertyInitializer & Setter(void(*setter)(_PropertySetterParamType< TValue >))
设置setter
Definition Property.h:399
StaticPropertyInitializer & Getter(TValue(*getter)())
设置getter
Definition Property.h:390
只写属性
Definition Property.h:1861
void SetterImpl(TSetterParam value) const
设置属性值
Definition Property.h:1908
WriteOnlyProperty(const MemberPropertyInitializer< TOwner, T > &initializer)
构造成员属性
Definition Property.h:1885
WriteOnlyProperty(const StaticPropertyInitializer< T > &initializer)
构造静态属性
Definition Property.h:1897
字段访问器,用于实现使用operator->取属性字段
Definition Property.h:188
std::enable_if< std::is_pointer< U >::value, U >::type operator->()
指针类型,直接返回值
Definition Property.h:207
T value
字段访问器所维护的值
Definition Property.h:192
FieldsAccessor(Args &&...args)
构造字段访问器
Definition Property.h:198
std::enable_if<!std::is_pointer< U >::value &&!_HasArrowOperator< U >::value, U * >::type operator->()
非指针类型,且无operator->,返回值的地址
Definition Property.h:216
std::enable_if<!std::is_pointer< U >::value &&_HasArrowOperator< U >::value, typename_HasArrowOperator< U >::type >::type operator->()
非指针类型,且有operator->,转发operator->
Definition Property.h:225
判断类型是否可以使用[]操作符的辅助模板
Definition Property.h:148
判断类型是否有operator->的辅助模板
Definition Property.h:164
判断类型是否有GetterImpl成员的辅助模板
Definition Property.h:102
判断类型是否有SetterImpl成员的辅助模板
Definition Property.h:117
判断类型是否可以显式转换的辅助模板
Definition Internal.h:19
_IsProperty的实现
Definition Property.h:81
判断类型是否为属性的辅助模板
Definition Property.h:95
判断类型是否为可读属性的辅助模板
Definition Property.h:133
判断类型是否为可写属性的辅助模板
Definition Property.h:141