私はC#でのプロパティのアイデアが本当に好きで、ちょっとした副次的なプロジェクトとして、C++でプロパティを実装するというアイデアをいじくり回してきました。私はこの例https://stackoverflow.com/a/5924594/245869に出くわしましたが、これはかなりいいようですが、ラムダと非静的データメンバーの初期化によって非常に良い構文を使用できるようになるかもしれないと思わずにはいられませんでしたこのアイデアで。これが私の実装です:
#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_'
したがって、プロパティ実装の概念は機能しているように見えますが、ラムダ関数から他のデータメンバーにアクセスできないため、無駄になる可能性があります。規格が私がここでやろうとしていることをどのように定義しているかわかりません、私は完全に運が悪いのですか、それとも私はここで何かをしていないだけですか?