저는 C#에서 속성에 대한 아이디어를 정말 좋아합니다. 그리고 작은 프로젝트로서, 저는 C++로 구현하는 아이디어를 고수해 왔습니다. 꽤 좋은 것처럼 보인이 예제 https://stackoverflow.com/a/5924594/245869을 만났지 만, lambda와 non-static 데이터 멤버 초기화가이 아이디어와 함께 아주 멋진 구문을 사용할 수 있다고 생각할 수는 없습니다.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;
}
나는 일반적으로 내 재산 클래스를 사용할 수 있습니다
가 데이터로 속성을 사용하여에 g ++ 4.7과 함께하지만,는 MinGW 특히 내 시도에 대해 상관하지 않는다 [주가()의 예를 참조] : 여기 내 구현의 회원 :
\property.cpp: In lambda function:
\property.cpp:40:7: error: invalid use of non-static data member 'Foobar::num_'
그래서 내 재산 구현의 개념이 작동하는 것 같다,하지만 난 내 람다 함수에서 다른 데이터 멤버에 액세스 할 수 있기 때문에 헛된 수 있습니다. 나는 표준이 내가 여기에서하려고 노력하고있는 것을 어떻게 정의하고 있는지에 관해 명확히하지 않고있다, 나는 완전히 운이 나간다, 그렇지 않으면 나는 단지 바로 여기에서 무엇인가하지 않고있다?
관련 없음 : 이동 전용 유형을 지원하고 일반적으로 불필요한 사본을 피하려면 생성자에서 getter_ (std :: move (getter)), setter_ (std :: move (setter))를 원할 수도 있습니다. –
질문 : 재미있는 것과는 달리, 간단한 'int'가 더 유용 할 것이라고 믿습니다. 간단한 참조에 비해 솔루션의 장점은 무엇입니까? (그 자체는 쓸모가 없다.) –
@ R.MartinhoFernandes 나는 완전히 동의한다. 'property <>'자체는 속성을 가진 클래스가 복사/이동 될 수 있도록 복사/이동 의미를 지원해야한다. 개념을 작동시킬 때까지 구현을 가능한 한 최소화하고 싶었습니다. 그래도 고마워! –