namespace detail
{
template<typename T>
struct dummy
{
T get() const { return T(); }
void set(T) { }
};
}
#include <type_traits>
// Simple Property
template<typename Value,
typename ValueOwner = detail::dummy<Value>,
Value (ValueOwner::*Getter)(void) const = &ValueOwner::get,
void (ValueOwner::*Setter)(Value) = &ValueOwner::set,
bool = std::is_same<ValueOwner, detail::dummy<Value>>::value
>
class Property {
public:
Value get() const { return m_value; }
void set(Value value) { m_value = value; }
private:
Value m_value;
};
// Complicated Property
template<
typename Value,
typename ValueOwner,
Value (ValueOwner::*Getter)(void) const,
void (ValueOwner::*Setter)(Value)
>
class Property<Value, ValueOwner, Getter, Setter, false>
{
// Stuff for calling the getter & setter
};
struct MyClass
{
int get() const { return 42; }
void set(int) { }
};
int main()
{
Property<int> simpleProperty;
simpleProperty.get();
Property<int, MyClass, &MyClass::get, &MyClass::set> complicatedProperty;
}
ICAgIG5hbWVzcGFjZSBkZXRhaWwKICAgIHsKICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgIHN0cnVjdCBkdW1teQogICAgICAgIHsKICAgICAgICAgICAgVCBnZXQoKSBjb25zdCB7IHJldHVybiBUKCk7IH0KICAgICAgICAgICAgdm9pZCBzZXQoVCkgeyB9CiAgICAgICAgfTsKICAgIH0KCiAgICAjaW5jbHVkZSA8dHlwZV90cmFpdHM+CgogICAgLy8gU2ltcGxlIFByb3BlcnR5CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwKICAgICAgICAgICAgIHR5cGVuYW1lIFZhbHVlT3duZXIgPSBkZXRhaWw6OmR1bW15PFZhbHVlPiwKICAgICAgICAgICAgIFZhbHVlIChWYWx1ZU93bmVyOjoqR2V0dGVyKSh2b2lkKSBjb25zdCA9ICZWYWx1ZU93bmVyOjpnZXQsCiAgICAgICAgICAgICB2b2lkIChWYWx1ZU93bmVyOjoqU2V0dGVyKShWYWx1ZSkgPSAmVmFsdWVPd25lcjo6c2V0LAogICAgICAgICAgICAgYm9vbCA9IHN0ZDo6aXNfc2FtZTxWYWx1ZU93bmVyLCBkZXRhaWw6OmR1bW15PFZhbHVlPj46OnZhbHVlCiAgICAgICAgICAgICA+CiAgICBjbGFzcyBQcm9wZXJ0eSB7CiAgICAgICAgcHVibGljOgoKICAgICAgICAgICAgVmFsdWUgZ2V0KCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQoKICAgICAgICAgICAgdm9pZCBzZXQoVmFsdWUgdmFsdWUpIHsgbV92YWx1ZSA9IHZhbHVlOyB9CgogICAgICAgIHByaXZhdGU6CgogICAgICAgICAgICBWYWx1ZSBtX3ZhbHVlOwogICAgfTsKCiAgICAvLyBDb21wbGljYXRlZCBQcm9wZXJ0eQogICAgdGVtcGxhdGU8CiAgICAgICAgdHlwZW5hbWUgVmFsdWUsCiAgICAgICAgdHlwZW5hbWUgVmFsdWVPd25lciwKICAgICAgICBWYWx1ZSAoVmFsdWVPd25lcjo6KkdldHRlcikodm9pZCkgY29uc3QsCiAgICAgICAgdm9pZCAoVmFsdWVPd25lcjo6KlNldHRlcikoVmFsdWUpCiAgICA+CiAgICBjbGFzcyBQcm9wZXJ0eTxWYWx1ZSwgVmFsdWVPd25lciwgR2V0dGVyLCBTZXR0ZXIsIGZhbHNlPgogICAgewogICAgICAvLyBTdHVmZiBmb3IgY2FsbGluZyB0aGUgZ2V0dGVyICYgc2V0dGVyCiAgICB9OwoKICAgIHN0cnVjdCBNeUNsYXNzCiAgICB7CiAgICAgICAgaW50IGdldCgpIGNvbnN0IHsgcmV0dXJuIDQyOyB9CiAgICAgICAgdm9pZCBzZXQoaW50KSB7IH0KICAgIH07CgogICAgaW50IG1haW4oKQogICAgewogICAgICAgIFByb3BlcnR5PGludD4gc2ltcGxlUHJvcGVydHk7CiAgICAgICAgc2ltcGxlUHJvcGVydHkuZ2V0KCk7CgogICAgICAgIFByb3BlcnR5PGludCwgTXlDbGFzcywgJk15Q2xhc3M6OmdldCwgJk15Q2xhc3M6OnNldD4gY29tcGxpY2F0ZWRQcm9wZXJ0eTsKICAgIH0K