С++ 11; Могут ли не -инициализации статических элементов данных получить доступ к другим элементам данных?

Мне очень нравится идея свойств в C #, и в качестве небольшого побочного проекта я обдумывал идею их реализации на C++. Я столкнулся с этим примером https://stackoverflow.com/a/5924594/245869, который кажется довольно хорошим, но я не мог не думать, что лямбда-выражения и не -инициализация статических элементов данных могут позволить использовать очень хороший синтаксис с этой идеей. Вот моя реализация:

#include 
#include 

using namespace std;


template< typename T >
class property {

public:
    property(function getter, function setter)
        : getter_(getter),
          setter_(setter)
    {};

    operator const T&() {
        return getter_();
    };

    property& operator=(const T& value) {
        setter_(value);
    }

private:
    function getter_;
    function setter_;

};


class Foobar {

public:
    property num {
        [&]() { return num_; },
        [&](const int& value) { num_ = value; }
    };

private:
    int num_;

};


int main() {
    // This version works fine...
    int myNum;
    property num = property(
        [&]() { return myNum; },
        [&](const int& value) { myNum = value; }
    );
    num = 5;

    cout << num << endl;  // Outputs 5
    cout << myNum << endl;  // Outputs 5 again.

    // This is what I would like to see work, if the property
    // member of Foobar would compile...
    // Foobar foo;
    // foo.num = 5;

    // cout << foo.num << endl;

    return 0;
}

Я могу нормально использовать свой класс свойств [см. пример в main ()],но MinGW с g++ 4.7 не особенно заботится о моей попытке использовать свойство в качестве члена данных :

\property.cpp: In lambda function:
\property.cpp:40:7: error: invalid use of non-static data member 'Foobar::num_'

. Таким образом, кажется, что концепция реализации моего свойства работает, но это может быть напрасно, потому что я не могу получить доступ к другим элементы данных из моих лямбда-функций. Я не уверен, как стандарт определяет то, что я пытаюсь здесь сделать, мне совсем не повезло, или я просто что-то не так делаю?

6
задан Community 23 May 2017 в 10:34
поделиться