2010-06-27 13 views
8

मैं बूस्ट में "फंक्शन" वर्ग प्रलेखन पर एक नज़र हो रही थी, और इस पार ठोकर खाई:सी ++ अजीब वाक्य रचना बूस्ट टेम्पलेट में देखा पैरामीटर

boost::function<float (int x, int y)> f; 

मैं इस वाक्य रचना स्वीकार करना होगा मेरे लिए अत्यधिक भ्रामक है। यह कानूनी सी ++ कैसे हो सकता है?

क्या हुड के नीचे कोई चाल है? क्या यह वाक्यविन्यास कहीं भी दस्तावेज है?

+0

कृपया प्रति प्रश्न केवल एक प्रश्न पूछें - यदि आपके पास दो प्रश्न पूछने हैं, तो दो अलग-अलग प्रश्न सबमिट करें। – bdonlan

+0

सच है, क्षमा करें, मैं इसे फिर से नहीं करूँगा – Dinaiz

+0

आप किसी अन्य प्रश्न में इसे विभाजित करने के लिए प्रश्नों में से किसी एक को हटाने के लिए अपना प्रश्न संपादित कर सकते हैं - इस तरह उत्तर देना मुश्किल है क्योंकि अगर किसी को केवल आपके प्रश्नों का उत्तर पता है , वे एक उत्तर जमा करने के लिए अनिच्छुक महसूस करेंगे। – bdonlan

उत्तर

9

[संपादित करें] यह लेखक के मूल, अनिवार्य प्रश्न का उत्तर है जो वास्तव में दो प्रश्न थे।

मुझे यह सिंटैक्स स्वीकार करना होगा मेरे लिए भ्रमित है। यह कानूनी सी ++ कैसे हो सकता है? :) क्या हुड के नीचे कोई चाल है? क्या यह वाक्यविन्यास कहीं भी दस्तावेज है?

यह पूरी तरह से कानूनी है और यह वास्तव में बहुत जटिल नहीं है।

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)); 

मैं सच में लगता है की कोशिश कर के व्यापार बंद इसे और अधिक जटिल बनाने के लिए यह लायक नहीं है। बूस्ट लेखक बूस्ट :: फ़ंक्शन के लिए एक बेहद सामान्य उद्देश्य समाधान लिखना चाहते थे जिसका उपयोग कई प्लेटफार्मों और कंपाइलरों में कई लोगों द्वारा किया जाएगा। हालांकि, उन्होंने एक एकीकृत पूर्ववत प्रणाली में विभिन्न हस्ताक्षरों के साथ कार्यों को निष्पादित करने में सक्षम कमांड सिस्टम को सामान्य करने की कोशिश नहीं की थी (इस प्रकार इन आदेशों की स्थिति को संरक्षित करने की आवश्यकता होती है, भले ही शुरुआत में उन्हें कॉल करना समाप्त हो जाए और पूर्ववत हो जाएं - बाद के निष्पादन पर मूल स्थिति डेटा को दोबारा निर्दिष्ट किए बिना उन्हें निष्पादित करें)। इसके लिए, आपकी विरासत-आधारित दृष्टिकोण सबसे अधिक संभव और सबसे सरल है।

+2

'टाइपपीफ फ्लोट (int, int) कमांड ', मुझे खेद है, कानूनी सी नहीं है। सही सी कोड' टाइपपीफ फ्लोट कमांड (int, int) 'होगा। 'typedef' नियमित घोषणा लेता है, और नामित ऑब्जेक्ट (यानी, फ़ंक्शन या चर) को परिभाषित करने के बजाय, यह ऑब्जेक्ट के प्रकार के प्रकार के लिए उपनाम के रूप में नाम का उपयोग करता है। –

+0

+1 ग्रेट उत्तर – fingerprint211b

+0

@ डेल माफी, आप सही हैं और यह सी ++ में भी गैरकानूनी है। सी <फ्लोट (int, int)> सी के साथ सी को पैरामीटरकृत करने के तरीके को समझाने की कोशिश करते समय यह जल्दबाजी में गलती थी; यह लेखन के बराबर है: टाइपपीफ फ्लोट कमांड (int, int); सी सी। मैंने गलती को सही करने के लिए इसे संपादित किया। – stinky472

संबंधित मुद्दे