OldSchoolHack

Register / Login English

[C++] Implementieren von Properties mit Lambdas

icon Thread: [C++] Implementieren von Properties mit Lambdas

Join Date: Aug 2007

Posts: 8643

User-Rating:

199 positive
33 negative
Hallöchen,

wer mit der VCL oder .NET programmiert, der kennt sicher Properties in Klassen, die man durch Getter und Setter steuern kann.

CSHARP Code:
  1. class PropTest
  2. {
  3. private int var;
  4. public int Var
  5. {
  6. get
  7. {
  8. return var;
  9. }
  10. set
  11. {
  12. var = value;
  13. }
  14. }
  15. }
  16.  
  17. PropTest pt = new PropTest();
  18. pt.Var = 123;
  19. int var = pt.Var;
Im normalen C++ gibt es sowas leider (noch) nicht. Aber dank den neuen C++11 Features wie Lambdas kann man sich da was schönes selbst basteln:

CPP Code:
  1. //Property.hpp
  2. #include <functional>
  3.  
  4. template<typename ValueType>
  5. class Property
  6. {
  7. public:
  8. Property()
  9. {
  10.  
  11. }
  12. //---------------------------------------------------------------------------
  13. Property(const std::function<ValueType()> &get, const std::function<void(ValueType)> &set)
  14. {
  15. this->get = get;
  16. this->set = set;
  17. }
  18. //---------------------------------------------------------------------------
  19. ValueType operator = (const ValueType& value)
  20. {
  21. if (set == nullptr)
  22. {
  23. throw 1;
  24. }
  25.  
  26. set(value);
  27.  
  28. return value;
  29. }
  30. //---------------------------------------------------------------------------
  31. operator ValueType()
  32. {
  33. if (get == nullptr)
  34. {
  35. throw 1;
  36. }
  37.  
  38. return get();
  39. }
  40. //---------------------------------------------------------------------------
  41.  
  42. private:
  43. std::function<ValueType()> get;
  44. std::function<void(ValueType)> set;
  45. };
CPP Code:
  1. class PropTest
  2. {
  3. public:
  4. PropTest() :
  5. Var(
  6. //getter
  7. [this]()
  8. {
  9. return var;
  10. },
  11. //setter
  12. [this](int value)
  13. {
  14. var = value;
  15. })
  16. {
  17.  
  18. }
  19.  
  20. Property<int> Var;
  21.  
  22. private:
  23. int var;
  24. };
  25.  
  26. PropTest pt;
  27. pt.Var = 123;
  28. int var = pt.Var;
Wenn eine Property schreibgeschütz sein soll, setzt einfach den setter auf 0, dann gibt es eine Exception, wenn versucht wird, den Wert zu schreiben:
CPP Code:
  1. Var([this]() { return var; }, 0);
  2. ...
  3. try
  4. {
  5. pt.Var = 123;
  6. }
  7. catch (...)
  8. {
  9. //pt.Var ist schreibgeschützt
  10. }
Für WriteOnly kann natürlich auch einfach der getter auf 0 gesetzt werden.

Vielleicht kanns ja einer von euch gebrauchen oder lernt zumindest was daraus.

greetz KN4CK3R

__________________

Hallo