Как реализовать универсальные средства доступа для класса свойств

Как будут реализованы общие аксессоры для класса свойств и их значения по умолчанию?

Я грубо думаю, что это будет выглядеть следующим образом:

template
<p> Геттер и Сеттер должны быть даны как лямбды. Правильно ли это, и как мне продолжить?</p>
2 ответа

Вы могли бы согласиться на какой-то структурный интерфейс для геттеров и сеттеров, а затем реализовать что-то вроде этого:

template <typename t=""> struct default_getter
{
 T & operator()(T & x) const { return x; }
 T const & operator()(T const & x) const { return x; }
};

template <typename t=""> struct default_setter
{
 template <typename u="">
 void operator()(T & x, U && u) const { x = std::forward<u>(u); }
};

template <typename t,="" typename="" getter="default_getter<T">,
 typename Setter = default_setter<t>>
class Property
{
 struct PropertyImpl : Getter, Setter
 { 
 T value;
 };

 PropertyImpl impl;
public:
 template <typename u="">
 void set(U && u)
 {
 static_cast<setter &="">(impl)(impl.value, std::forward<u>(u));
 }

 T & get()
 {
 static_cast<getter &="">(impl)(impl.value);
 }

 T const & get() const 
 {
 static_cast<getter const="" &="">(impl)(impl.value);
 }
};
</getter></getter></u></setter></typename></t></typename></u></typename></typename></typename>

Теперь вы можете использовать его так:

struct Foo
{
 Property<bar> bar;
};

Foo x;
x.bar.get();
x.bar.set(10);
</bar>


Я бы предложил решение, используя std::function.

template<typename t="">
struct Property
{
 typedef std::function<t()> GetterFunc;
 typedef std::function<void(const t&)=""> SetterFunc;

 Property (T value, GetterFunc getter, SetterFunc setter) 
 : m_getter(getter)
 , m_setter(setter) 
 {
 }

 Property(T value) 
 : m_getter( [value](){ return value; }
 , m_setter ( [](const T&) { } ) // I have know clue what behaviour you want here
 {
 }

 T Get() { return m_getter(); }
 void Set(const T& value) { m_setter(value); }

private:

 GetterFunc m_getter;
 SetterFunc m_setter;
} 
</void(const></t()></typename>

licensed under cc by-sa 3.0 with attribution.