की मैं इस तरह एक struct है लगता है:नाम से संरचना चर का उपयोग करने के लिए टेम्पलेट का उपयोग किया जा सकता है?
struct my_struct
{
int a;
int b;
}
मैं एक समारोह है जो या तो "एक" या "b" के लिए एक नया मान निर्धारित करना चाहिए है। इस फ़ंक्शन को यह निर्दिष्ट करने की भी आवश्यकता है कि कौन सा चर सेट करना है। एक विशिष्ट उदाहरण इस तरह होगा:
void f(int which, my_struct* s, int new_value)
{
if(which == 0)
s->a = new_value;
else
s->b = new_value;
}
कारणों मैं यहाँ नहीं लिखेंगे के लिए मैं च के लिए ख एक/सूचक पारित नहीं कर सकते हैं। इसलिए मैं my_struct :: a या my_struct :: b के पते के साथ f को कॉल नहीं कर सकता। एक और चीज जो मैं नहीं कर सकता वह है कि वेक्टर (इंट वर्र्स [2]) को my_struct में घोषित करें और एफ को इंडेक्स के रूप में एक पूर्णांक पास करें। मूल रूप से f में मुझे चर से चर का उपयोग करने की आवश्यकता है।
पिछले उदाहरण के साथ समस्या यह है कि भविष्य में मैं संरचना में अधिक चर जोड़ने की योजना बना रहा हूं और उस स्थिति में मुझे और अधिक जोड़ना याद रखना चाहिए, जो पोर्टेबिलिटी के लिए खराब है। एक बात मैं कर सकता च एक मैक्रो, इस तरह के रूप में लिखें है:
#define FUNC(which)
void f(my_struct* s, int new_value) \
{ \
s->which = new_value; \
}
और फिर मैं समारोह कह सकते हैं (क) या समारोह (ख)।
यह काम करेगा लेकिन मुझे मैक्रोज़ का उपयोग करना पसंद नहीं है। तो मेरा सवाल है: क्या मैक्रोज़ के बजाय टेम्पलेट का उपयोग करके एक ही लक्ष्य प्राप्त करने का कोई तरीका है?
EDIT: मैं यह बताने की कोशिश करूंगा कि मैं पॉइंटर्स का उपयोग क्यों नहीं कर सकता और मुझे नाम से परिवर्तनीय तक पहुंच की आवश्यकता है। मूल रूप से संरचना में एक प्रणाली की स्थिति होती है। अनुरोध किए जाने पर इस सिस्टम को अपने राज्य को "पूर्ववत" करने की आवश्यकता है। (Mystruct अन्य प्रकार के चर के रूप में अच्छी तरह से शामिल है)
class undo_token
{
public:
void undo(my_struct* s) = 0;
};
तो मैं बहुरूपता की वजह से पूर्ववत विधि की ओर इशारा पारित नहीं कर सकते हैं: पूर्ववत करें इस तरह undo_token नामक एक इंटरफ़ेस का उपयोग कर नियंत्रित किया जाता है।
जब मैं एक नया वेरिएबल संरचना करने के लिए मैं आम तौर पर भी, एक नया वर्ग को जोड़ने के इस तरह जोड़ें:
class undo_a : public undo_token
{
int new_value;
public:
undo_a(int new_value) { this->new_value = new_value; }
void undo(my_struct *s) { s->a = new_value}
};
समस्या जब मैं टोकन बनाने मैं रों सूचक नहीं जानता है, इसलिए मैं नहीं कर सकता एक सूचक को एस :: को कन्स्ट्रक्टर में सहेजें (जो समस्या हल कर लेगा)। "बी" के लिए कक्षा समान है, बस मुझे एस->
शायद यह एक डिज़ाइन समस्या है: मुझे प्रति चर प्रकार पूर्ववत टोकन की आवश्यकता है, एक नहीं प्रति चर ...
FUNC (ए) - एफ (एस, new_value) परिभाषित करेगा। लेकिन फिर आप इसे कैसे बुलाएंगे? –
हाँ क्षमा करें कि एक गलती थी। लेकिन मुझे उम्मीद है कि आपको वैसे भी बिंदु मिल जाएगा :) – Emiliano
मेरे संपादन के बाद भी, मेरे उत्तर और माइकोला गोलबुएव के उपयोग से, आप अभी भी अपने पूर्व वर्ग को क्लास डेटा सदस्य के सूचक के साथ पैरामीटर कर सकते हैं और इसे सदस्य आमंत्रण पर कक्षा/संरचना में बाध्य कर सकते हैं पहर। – camh