Tôi thực sự thích ý tưởng về các thuộc tính trong C#, và như là một dự án nhỏ bên, tôi đã tinkering với ý tưởng triển khai chúng trong C++. Tôi chạy vào ví dụ này https://stackoverflow.com/a/5924594/245869 mà có vẻ khá tốt đẹp, nhưng tôi không thể không nghĩ rằng lambdas và khởi tạo thành viên dữ liệu không tĩnh có thể làm cho nó có thể sử dụng một số cú pháp rất tốt đẹp với ý tưởng này. Dưới đây là thực hiện của tôi:C++ 11; Có thể khởi tạo thành viên dữ liệu không tĩnh truy cập các thành viên dữ liệu khác không?
#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;
}
tôi có thể sử dụng lớp tài sản của tôi bình thường [xem ví dụ trong main()], nhưng MinGW với g ++ 4.7 không đặc biệt quan tâm đến nỗ lực của tôi lúc sử dụng tài sản như một dữ liệu thành viên:
\property.cpp: In lambda function:
\property.cpp:40:7: error: invalid use of non-static data member 'Foobar::num_'
Vì vậy, có vẻ như vô ích vì tôi không thể truy cập các thành viên dữ liệu khác từ các hàm lambda của tôi. Tôi không chắc làm thế nào tiêu chuẩn xác định những gì tôi đang cố gắng để làm ở đây, tôi hoàn toàn không may mắn, hoặc tôi chỉ không làm điều gì đó ngay tại đây?
Không liên quan: Bạn có thể muốn 'getter_ (std :: move (getter)), setter_ (std :: move (setter))' trong consructor, để hỗ trợ các kiểu di chuyển, và tránh các bản sao không liên quan nói chung. –
Câu hỏi: ngoài việc thú vị, tôi tin rằng một 'int &' đơn giản sẽ hữu ích hơn. Lợi thế của giải pháp của bạn trên một tham chiếu đơn giản là gì? (Mà chính nó là vô ích ...) –
@ R.MartinhoFernandes Tôi hoàn toàn đồng ý. Bản thân 'property <>' cũng cần hỗ trợ các ngữ nghĩa sao chép/di chuyển để các lớp với các thuộc tính có thể được sao chép/di chuyển. Tôi muốn tiếp tục triển khai càng ít càng tốt cho đến khi tôi có thể làm cho khái niệm này hoạt động. Cảm ơn mặc dù! –