我非常喜欢C#中的属性概念,作为一个小的副业项目,我一直在尝试将其实现到C++中。我遇到了这个例子https://dev59.com/k2025IYBdhLWcg3w1JiG#5924594 ,看起来相当不错,但我不禁想到,使用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函数中访问其他数据成员。我不确定标准如何定义我在这里尝试做什么,我完全没有运气,还是我在这里做错了?
getter_(std::move(getter)), setter_(std::move(setter))
来支持只可移动的类型,并通常避免不必要的拷贝。 - R. Martinho Fernandesint&
会更有用。你的解决方案相比于一个简单的引用有什么优势?(本身就是无用的...) - Matthieu M.property<>
本身也需要支持复制/移动语义,以便可以复制/移动具有属性的类。我希望在能够使概念工作之前尽可能保持实现最小化。不过还是谢谢! - Bret Kuhnsobj1.setSomething(obj2.getSomething())
与obj1.something = obj2.something
)。getter/setter允许对象在获取/设置时执行一些操作,例如对数据本身进行操作(翻译),或在获取/设置时执行幕后操作。例如,对于一个大对象的数据成员,我可以等到调用它的getter时再加载它,而不是在构造时强制加载。 - Bret Kuhns