Мне очень нравится идея свойств в 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_'
. Таким образом, кажется, что концепция реализации моего свойства работает, но это может быть напрасно, потому что я не могу получить доступ к другим элементы данных из моих лямбда-функций. Я не уверен, как стандарт определяет то, что я пытаюсь здесь сделать, мне совсем не повезло, или я просто что-то не так делаю?