我真的很喜歡C#中的屬性概念,作爲一個小項目,我一直在修改C++實現它們的想法。我遇到了這個例子https://stackoverflow.com/a/5924594/245869,這看起來相當不錯,但我忍不住想起lambdas和非靜態數據成員初始化可能使得使用這個想法使用一些非常好的語法成爲可能。下面是我實現的:C++ 11;非靜態數據成員初始化可以訪問其他數據成員嗎?
#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函數訪問其他數據成員。我不確定這個標準是如何定義我在這裏要做的,我完全是運氣不好,還是我沒有在這裏做什麼?
無關:您可能希望在consructor中使用'getter_(std :: move(getter)),setter_(std :: move(setter))',以支持僅移動類型,並避免一般的無關副本。 – 2012-04-26 14:33:39
問題:除了有趣之外,我相信一個簡單的'int&'會更有用。您的解決方案比簡單參考有什麼優勢? (這本身是沒用的......) – 2012-04-26 15:34:04
@ R.MartinhoFernandes我完全同意。 'property <>'本身也需要支持複製/移動語義,以便可以複製/移動具有屬性的類。我希望儘可能保持最小化,直到我能夠使這個概念發揮作用。雖然謝謝! – 2012-04-26 16:49:28