我真的很喜欢 C# 中的属性的想法,作为一个小项目,我一直在修改用 C++ 实现它们的想法。我遇到了这个例子https://stackoverflow.com/a/5924594/245869看起来相当不错,但我不禁认为 lambdas 和非静态数据成员初始化可能使使用一些非常好的语法成为可能有了这个想法。这是我的实现:
#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() 中的示例],但是带有 g++4.7 的 MinGW 并不特别关心我尝试将属性用作数据成员:
\property.cpp: In lambda function:
\property.cpp:40:7: error: invalid use of non-static data member 'Foobar::num_'
所以似乎我的属性实现的概念有效,但它可能是徒劳的,因为我无法从我的 lambda 函数访问其他数据成员。我不确定标准如何定义我在这里尝试做的事情,我完全不走运,还是我只是没有在这里做某事?