Кресты / Говнокод #8270 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
template <
	typename PropertyOwner // Класс владельца
>
class properties {
public:
	// Получить указатель на владельца по указателю на свойство
	static PropertyOwner * owner( void * property ) { 
		int aai = (int)&(((PropertyOwner*)0)->__properties);
		return (PropertyOwner *)((char*)property - aai);
	}
};
 
/**
 * Шаблон класса свойства
 */
template <
	typename PropertyOwner, // Класс владельца
	typename PropertyType, // Тип свойства
	PropertyType (PropertyOwner::*getter)(), // Геттер
	void (PropertyOwner::*setter)(PropertyType) > // Сеттер
class property {
public:
 
	/**
	 * Чтение свойства - вызов геттера
	 */
	operator PropertyType() {
		return (properties<PropertyOwner>::owner( this )->*getter)();
	}
 
	/**
	 * Запись в свойство - вызов сеттера
	 */
	void operator = ( const PropertyType & value ) {
		(properties<PropertyOwner>::owner( this )->*setter)( value );
	}
};
 
// Макросы для удобного определения свойств /////////
 
/**
 * Начать объявления свойств в классе cls
 */
#define properties_start(cls) union { properties<cls> __properties;
 
/**
 * Закончить объявление свойств в классе cls
 */
#define properties_end() };
 
/**
 * Объявить свойство в классе cls типа type c геттером getter и сеттером setter
 */
#define property(cls,type,getter,setter) property<cls,type,&cls::getter,&cls::setter>

http://www.codenet.ru/progr/cpp/cpp-properties.php

Запостил: AnimeGovno-_- AnimeGovno-_-, (Updated )

Комментарии (3) RSS

  • Увидел хак не соответствующий стандарту:
    // Получить указатель на владельца по указателю на свойство
    	static PropertyOwner * owner( void * property ) { 
    		int aai = (int)&(((PropertyOwner*)0)->__properties);
    		return (PropertyOwner *)((char*)property - aai);
    	}
    Дальше не читал.
    Ответить
  • т?R$VR!K O"B"T E"N"M)W"Z"Y.E!P,Z:B:Z"H$A?I Y"P.S(G!J?O"R?E)L,S"I.J E"OA U)W.W:M?D)Y(Q,S?Y(W$PF:C C,L?L,T"H.X,R!J?D:G.Y S X"I(K"G!T"O)F.I(W)M:I)N Z!Q.AQ)CA(I.Y"Q$D$H.KN(B,C$F!W:I"Y(GSR!H,M)T"C)E)N!C!W?B,Q,XC(N"X$Y!Y JXO U$X Y.AW$G,Y?N"S$S H?I?F:Z.M(O$Z"I:S"DB(D:Z)O"W:E A?LMX$B,M?D N L(L$RB!N?Z.H:F.K)P?L"G,R.HV)W!U(U K.C Y)K(O,A"B?R?W Y.L E:C(X!B!V.GJ?S M XY$J(B.R?V:O$T?S:Z:X!Q.E G W B.Z?DC:S(W,K?O$S,Q"XM?F E.H!R"A?J?E(O A$C:F?Q?Z M.R"N:B!Z I L,S?I!P!K?D!O?B"G"B$S:C(Q(K"Z,W$J$WO!H J"D.M,Q:V,U:G"G!E(L)K.D.N I"R"X.A)E)U"A)I:L"R:L?Q,M)N$J:O CP.I"T(I"J$E?Z(W(A(O,C!K P?Z,N YO"Z AC F?A!I!G$Y(Z:E G O$P(C KE!W:M R.F$FR"K)Z K?FTV(L$R(W(W"N!S:Q$M!R.Z F(D!W:AN(Q(O)E.X(M"OV"W$U$CA:E:Z,F Z)O$R"J)HP.E$H!L:P:EF"RJL L F)Z A?G K"N,Y"I)F"F?L!S.S$J.V(X.V$KB.G:W$CS:S.N.Q(Q W.X!V,K:V,S.G.F"C!Z:R?L?R(Y"B)B"R,Z.J)G"F(G,W!W"MA(V.AF!X)O(T W.D"V)UX.I,H(G"OL?O?K)S(E?R:N,R$X,T:B$C?D"LD,D.M"H(N!A:C)F U!X:N"Q?E F!G?Q(P!W U(A.N(F:EZM:S.C.K V$H$L$F(L$W,C"P,H N!C?N,JB:FI!U.Y)P:W,P)N T:F.I J:W"F!K C:V?J,C.X:I U.U.V"JT!ZI(I?N?A(Y.H:U)V$I,S,W?LP(J?W,Q D.W?A(H S$Z(G.FH S!M?L"G I?J(Z:H$Y.KN.J.T,Y D:K)EW,X"T)Z"OE)CPRS(P.I)S"E V U Y!M$CJ$R(E)U"Q?GN!T(H:Y B(Z"W$S:Y!HR)D?C.P?ZB.B$W!Y"B"Y N,J:W"O?J,B!S.OB ET$Z)T?DТNSOYAZNKEFYOMAJHGBSQWDBEQZPZHPWAIFGDHYIAXEXNKAOWQEDXKZFQYGPAMGKXYPJUBSLSCEMJLTAAGDGLROYNOVWEPQKUWIKJTYVKSFMNNZGFJNMVRCZRQPFWSLNVSRWTAHZJTFWQLMJVMJHCBDJAMTPCYJAOZYSUARVFOGHAYNYZCKDGBV
    Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8