मुझे वास्तव में सी # में गुणों का विचार पसंद है, और थोड़ी सी साइड प्रोजेक्ट के रूप में, मैं सी ++ में उन्हें लागू करने के विचार से टंकण कर रहा हूं। मैं इस उदाहरण में भाग गया https://stackoverflow.com/a/5924594/245869 जो काफी अच्छा लगता है, लेकिन मैं मदद नहीं कर सका लेकिन लगता है कि लैम्ब्डा और गैर स्थैतिक डेटा सदस्य प्रारंभिकरण इस विचार के साथ कुछ बहुत अच्छे वाक्यविन्यास का उपयोग करना संभव कर सकता है।सी ++ 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;
}
मैं अपनी संपत्ति वर्ग सामान्य रूप से उपयोग कर सकते हैं एक डेटा के रूप में संपत्ति का उपयोग करने में है, लेकिन जी ++ 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' 'और अधिक उपयोगी होगा। एक साधारण संदर्भ पर आपके समाधान का क्या फायदा है? (जो स्वयं बेकार है ...) –
@ आर। मार्टिन्हो फर्नांडीस मैं पूरी तरह से सहमत हूं। 'संपत्ति <>' को स्वयं कॉपी/मूव सेमेन्टिक्स का समर्थन करने की भी आवश्यकता है ताकि गुणों वाले वर्गों की प्रतिलिपि बनाई जा सके। मैं कार्यान्वयन को तब तक कम से कम रखना चाहता था जब तक कि मैं अवधारणा को काम नहीं कर पाता। हालांकि धन्यवाद! –