[संपादित करें] यह लेखक के मूल, अनिवार्य प्रश्न का उत्तर है जो वास्तव में दो प्रश्न थे।
मुझे यह सिंटैक्स स्वीकार करना होगा मेरे लिए भ्रमित है। यह कानूनी सी ++ कैसे हो सकता है? :) क्या हुड के नीचे कोई चाल है? क्या यह वाक्यविन्यास कहीं भी दस्तावेज है?
यह पूरी तरह से कानूनी है और यह वास्तव में बहुत जटिल नहीं है।
template <class T>
class C
{
public:
T* function_pointer;
};
void fn(int x)
{
cout << x << endl;
}
int main(int argc, char** argv)
{
C<void (int x)> c;
c.function_pointer = &fn;
c.function_pointer(123); // outputs x
}
यह मूल रूप से कर के रूप में ही बात है:
typedef void Function(int);
C<Function> c;
इस प्रकार का सिर्फ लागू सी नहीं है ++, यह बस के रूप में सी में लागू है (वास्तविक प्रकार सेल्सियस तक पैरामिट्रीकृत है)। यहां पर टेम्पलेट जादू फ़ंक्शन टाइपपीफ की तरह कुछ ले रहा है और रिटर्न मानों और तर्कों के प्रकारों का पता लगाने में सक्षम है। समझाते हुए कि यहां बहुत लंबा होगा और बूस्ट :: फ़ंक्शन उस जानकारी को पुनर्प्राप्त करने के लिए बढ़ावा देने के लिए बहुत सारे फ़ंक्शन लक्षण मेटा-टेम्पलेट्स का उपयोग करता है। यदि आप वास्तव में यह जानने के लिए समय बिताना चाहते हैं, तो आपको बूस्ट में कार्य :: function_traits के साथ शुरू होने वाले बढ़ावा कार्यान्वयन को समझने की कोशिश करनी चाहिए। टाइप करें।
हालांकि, मैं आपकी सामान्य समस्या का समाधान करना चाहता हूं। मुझे लगता है कि आप पूरी तरह से स्वीकार्य कोड की कुछ पंक्तियों को सरल बनाने के लिए बहुत मेहनत कर रहे हैं। अपने पैरामीटरकृत सबक्लास कन्स्ट्रक्टर के माध्यम से अपने कमांड सबक्लास के लिए तर्क पारित करने में कुछ भी गलत नहीं है। क्या टाइपलिस्टों को शामिल करने और यहां :: फंक्शन-जैसे समाधानों को बढ़ावा देने की कोशिश करने के लायक है, इस प्रकार संकलन के समय और कोड जटिलता में काफी वृद्धि हुई है, बस इसके लिए?
आप इसे आगे को कम करना चाहते हैं, तो बस एक समारोह है कि किसी भी आदेश उपवर्ग निष्पादित और पूर्ववत ढेर में जोड़ने और इतने पर होगा अमल लिखें:
typedef boost::shared_ptr<Command> CommandPtr;
void execute(const CommandPtr& cmd)
{
cmd->execute();
// add command to undo stack or whatever else you want to do
}
// The client can simply write something like this:
execute(CommandPtr(new CmdAdd(some_value));
मैं सच में लगता है की कोशिश कर के व्यापार बंद इसे और अधिक जटिल बनाने के लिए यह लायक नहीं है। बूस्ट लेखक बूस्ट :: फ़ंक्शन के लिए एक बेहद सामान्य उद्देश्य समाधान लिखना चाहते थे जिसका उपयोग कई प्लेटफार्मों और कंपाइलरों में कई लोगों द्वारा किया जाएगा। हालांकि, उन्होंने एक एकीकृत पूर्ववत प्रणाली में विभिन्न हस्ताक्षरों के साथ कार्यों को निष्पादित करने में सक्षम कमांड सिस्टम को सामान्य करने की कोशिश नहीं की थी (इस प्रकार इन आदेशों की स्थिति को संरक्षित करने की आवश्यकता होती है, भले ही शुरुआत में उन्हें कॉल करना समाप्त हो जाए और पूर्ववत हो जाएं - बाद के निष्पादन पर मूल स्थिति डेटा को दोबारा निर्दिष्ट किए बिना उन्हें निष्पादित करें)। इसके लिए, आपकी विरासत-आधारित दृष्टिकोण सबसे अधिक संभव और सबसे सरल है।
कृपया प्रति प्रश्न केवल एक प्रश्न पूछें - यदि आपके पास दो प्रश्न पूछने हैं, तो दो अलग-अलग प्रश्न सबमिट करें। – bdonlan
सच है, क्षमा करें, मैं इसे फिर से नहीं करूँगा – Dinaiz
आप किसी अन्य प्रश्न में इसे विभाजित करने के लिए प्रश्नों में से किसी एक को हटाने के लिए अपना प्रश्न संपादित कर सकते हैं - इस तरह उत्तर देना मुश्किल है क्योंकि अगर किसी को केवल आपके प्रश्नों का उत्तर पता है , वे एक उत्तर जमा करने के लिए अनिच्छुक महसूस करेंगे। – bdonlan