#include <iostream>
#include <functional>
#include <string>
template < typename T>
class attr
{
std:: function < T( ) > const get;
std:: function < void ( T) > const set;
public :
template < typename Get, typename Set>
attr( Get get_, Set set_)
: get( get_) ,
set( set_)
{ }
operator T ( )
{
return get( ) ;
}
template < typename U>
attr& operator= ( U value)
{
set( value) ;
return * this ;
}
} ;
class person {
std:: string m_name;
int m_age;
public :
attr< std:: string > name {
[ this ] ( ) - > std:: string
{
std:: cout << "getting name: " << m_name << std:: endl ;
return this- > m_name;
} ,
[ this ] ( std:: string value)
{
std:: cout << "setting name: " << value << std:: endl ;
this- > m_name = value;
}
} ;
attr< int > age {
[ this ] ( ) - > int
{
std:: cout << "getting age: " << m_age << std:: endl ;
return this- > m_age;
} ,
[ this ] ( int value)
{
std:: cout << "setting age: " << value << std:: endl ;
this- > m_age = value;
}
} ;
} ;
int main( )
{
person someone;
someone.name = "John Doe" ;
someone.age = 42 ;
std:: cout << "Name: " << ( std:: string ) someone.name << std:: endl ; // Here's a potential issue with the wrapper. Take out the cast, it won't work.
std:: cout << "Age: " << someone.age << std:: endl ;
return someone.age ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHN0cmluZz4KIAp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgYXR0cgp7CiAgICBzdGQ6OmZ1bmN0aW9uPFQoKT4gY29uc3QgZ2V0OwogICAgc3RkOjpmdW5jdGlvbjx2b2lkKFQpPiBjb25zdCBzZXQ7CiAgICAKcHVibGljOgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIEdldCwgdHlwZW5hbWUgU2V0PgogICAgYXR0cihHZXQgZ2V0XywgU2V0IHNldF8pCiAgICAgIDogZ2V0KGdldF8pLAogICAgICAgIHNldChzZXRfKQogICAge30KICAgIAogICAgb3BlcmF0b3IgVCAoKQogICAgewogICAgICAgIHJldHVybiBnZXQoKTsKICAgIH0KICAgIAogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CiAgICBhdHRyJiBvcGVyYXRvcj0gKFUgdmFsdWUpCiAgICB7CiAgICAgICAgc2V0KHZhbHVlKTsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9Cn07CiAKY2xhc3MgcGVyc29uIHsKICAgIHN0ZDo6c3RyaW5nIG1fbmFtZTsKICAgIGludCBtX2FnZTsKIApwdWJsaWM6CiAgICBhdHRyPHN0ZDo6c3RyaW5nPiBuYW1lIHsKICAgICAgICBbdGhpc10oKSAtPiBzdGQ6OnN0cmluZwogICAgICAgIHsKICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJnZXR0aW5nIG5hbWU6ICIgPDwgbV9uYW1lIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fbmFtZTsKICAgICAgICB9LAogICAgICAgIFt0aGlzXShzdGQ6OnN0cmluZyB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAic2V0dGluZyBuYW1lOiAiIDw8IHZhbHVlIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgdGhpcy0+bV9uYW1lID0gdmFsdWU7CiAgICAgICAgfQogICAgfTsKIAogICAgYXR0cjxpbnQ+IGFnZSB7CiAgICAgICAgW3RoaXNdKCkgLT4gaW50CiAgICAgICAgewogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgImdldHRpbmcgYWdlOiAiIDw8IG1fYWdlIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgcmV0dXJuIHRoaXMtPm1fYWdlOwogICAgICAgIH0sCiAgICAgICAgW3RoaXNdKGludCB2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAic2V0dGluZyBhZ2U6ICIgPDwgdmFsdWUgPDwgc3RkOjplbmRsOwogICAgICAgICAgICB0aGlzLT5tX2FnZSA9IHZhbHVlOwogICAgICAgIH0KICAgIH07Cn07CiAKaW50IG1haW4oKQp7CiAgICBwZXJzb24gc29tZW9uZTsKICAgIHNvbWVvbmUubmFtZSA9ICJKb2huIERvZSI7CiAgICBzb21lb25lLmFnZSA9IDQyOwogICAgCiAgICBzdGQ6OmNvdXQgPDwgIk5hbWU6ICIgPDwgKHN0ZDo6c3RyaW5nKXNvbWVvbmUubmFtZSA8PCBzdGQ6OmVuZGw7IC8vIEhlcmUncyBhIHBvdGVudGlhbCBpc3N1ZSB3aXRoIHRoZSB3cmFwcGVyLiBUYWtlIG91dCB0aGUgY2FzdCwgaXQgd29uJ3Qgd29yay4KICAgIHN0ZDo6Y291dCA8PCAiQWdlOiAgIiA8PCBzb21lb25lLmFnZSA8PCBzdGQ6OmVuZGw7CiAKICAgIHJldHVybiBzb21lb25lLmFnZTsKfQo=