我真的很喜欢在C#属性的想法,作为一个小方项目,我一直在摆弄用C实现它们++的想法。 我就遇到了这个例子https://stackoverflow.com/a/5924594/245869这似乎相当不错,但我忍不住想,lambda表达式和非静态数据成员初始化使得可以使用一些非常漂亮的语法这种想法。 下面是我的实现:
#include <iostream>
#include <functional>
using namespace std;
template< typename T >
class property {
public:
property(function<const T&(void)> getter, function<void(const T&)> setter)
: getter_(getter),
setter_(setter)
{};
operator const T&() {
return getter_();
};
property<T>& operator=(const T& value) {
setter_(value);
}
private:
function<const T&(void)> getter_;
function<void(const T&)> setter_;
};
class Foobar {
public:
property<int> num {
[&]() { return num_; },
[&](const int& value) { num_ = value; }
};
private:
int num_;
};
int main() {
// This version works fine...
int myNum;
property<int> num = property<int>(
[&]() { 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_'
因此,似乎我的财产执行的概念作品,但它可能是徒劳的,因为我无法从我的lambda函数访问其他数据成员。 我不知道如何该标准定义了什么我想,我是不是在这里做完全出于运气,还是我只是没有做正确的事情吗?