C++ で簡単にアクセッサを書けるようにしたかったけど Non-static data members で auto が使えなくて死んだ

class X{
    int value_ = 42;
public:
    auto value = accessor(this, &X::value_);
};

みたいな感じで書きたかった。

[ソース]

template<typename Class, typename T>
struct accessor_impl{
    Class* class_;
    T Class::* member;

    T operator ()() const{
        return class_ ->* member;
    }

    void operator ()(T const& t) const{
        class_ ->* member = t;
    }
};


template<typename Class, typename T>
accessor_impl<Class, T>
accessor(Class* class_, T Class::* member){
    return { class_, member };
}


class X{
    int value_ = 42;
public:
//  auto value = accessor(this, &X::value_);
    accessor_impl<X, int> value{ this, &X::value_ };
};


#include <iostream>

int
main(){
    X x;
    std::cout << x.value() << std::endl;

    x.value(72);
    std::cout << x.value() << std::endl;

    return 0;
}

[出力]

42
72


つらい。