c++ - Boost's Interpreter.hpp example with class member functions -


बूस्ट

boost_1_41_0 \ libs \ function_types में एक उदाहरण फ़ाइल के साथ आता है \ उदाहरण के लिए

बुलाया जाता है

मैं एक ऐसी स्थिति बनाने की कोशिश कर रहा हूं जहां मेरे पास विभिन्न तर्कों, रिटर्न प्रकार, एक ही स्थान पर दर्ज किया जाना चाहिए। फिर एक फ़ंक्शन को निकालने और इसे कुछ पैरामीटर से निष्पादित करने की क्षमता है।

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

मैं कोड का अध्ययन कर रहा हूं और कक्षा सदस्य कार्यों को स्वीकार करने के लिए एक ही कार्यान्वयन प्राप्त करने की कोशिश कर रहा हूं, लेकिन अब तक असफल रहा है । मैं सोच रहा था कि किसी को संशोधनों की ज़रूरत है, या शायद कुछ इसी तरह से काम कर सकता है और कुछ ही कोड है।

उदाहरण में आप देखेंगे

  interpreter.register_function ("गूंज", और गूंज); Interpreter.register_function ("जोड़ें", और जोड़ें); Interpreter.register_function ("दोहराना", और दोहराएँ);  

मुझे कुछ करना है

  test x; Interpreter.register_function ("classFunc", बढ़ावा :: बाँध (और परीक्षण :: क्लासफ़ंक्शन, & amp; x));  

लेकिन यह तर्क संख्या की किसी भी संख्या को तोड़ता है। इसलिए मैं किसी प्रकार के ऑटो पैदा करने वाला बढ़ावा :: बाँध (और परीक्षण :: क्लासफंक, एंड एक्स, _1, _2, _3 ...) टिकट हूं, मैं इसे लागू करने का सबसे अच्छा तरीका अवश्य जानता हूं ।

धन्यवाद

मैं इस मुद्दे पर काम कर रहा हूं और मैंने कुछ हद तक सफल इंटरप्रीटर को सदस्य समारोह को स्वीकार करने में सफल हुआ जैसे:

  // दुभाषिया के साथ एक समारोह रजिस्टरों, // यदि यह सदस्य फ़ंक्शन है, तो यह संकलन नहीं करेगा। टेम्पलेट & lt; typename फ़ंक्शन & gt; Typename boost :: enable_if & lt; फुट :: is_nonmember_callable_builtin & LT; समारोह & gt; & Gt; :: प्रकार register_function (std :: string const & amp; नाम, फ़ंक्शन); // रजिस्टरों एक सदस्य दुभाषिया के साथ कार्य करता है // यदि यह एक गैर-सदस्यीय फ़ंक्शन है, तो उसे संकलित नहीं किया जाएगा। टेम्पलेट & lt; typename फ़ंक्शन, typename TheClass & gt; Typename boost :: enable_if & lt; फुट :: is_member_function_pointer & LT; समारोह & gt; & Gt; :: प्रकार register_function (std :: string const & amp; नाम, फ़ंक्शन फ़, द क्लास * theclass);  

सक्षम_आईफ़ कथन का उपयोग संकलन समय पर गलत पद्धति के उपयोग को रोकने के लिए किया जाता है। अब, आपको क्या समझने की आवश्यकता है:

  • यह बढ़ावा देने का उपयोग करता है :: एमएलपी पार्स को पार्स करने के लिए कॉल करने योग्य निर्मित के तर्क के पैरामीटर प्रकार (जो मूल रूप से फ़ंक्शन पॉइंटर है)
  • उसके बाद, संकलन समय पर एक संलयन सदिश तैयार करता है (जो एक वेक्टर होता है जो एक ही समय में विभिन्न प्रकार के विभिन्न वस्तुओं को स्टॉक कर सकता है)
  • जब एमप्ल हर तर्क को पार्स किया जाता है, तो "पार्सिंग" "लागू" पद्धति को लागू करने के लिए विधि लागू करें, टेम्पलेट्स के बाद विधि लागू करें।
  • मुख्य मुद्दा यह है कि किसी सदस्य कॉलबल निर्मित के पहले तर्क उस वस्तु को कहते हैं जो बुलाया विधि रखती है।
  • जहां तक ​​मुझे पता है, एमप्ल एक कॉल करने योग्य निर्माण (यानी एक बूस्ट :: बाइंड परिणाम) की तुलना में कुछ और के तर्कों को पार्स नहीं कर सकता

क्या करने की जरूरत है बस "पार्सिंग" लागू करने के लिए एक कदम जोड़ना है, जो संबंधित ऑब्जेक्ट को लागू लूप में जोड़ना होगा! यहां यह जाता है:

  टेम्पलेट & lt; typename फ़ंक्शन, typename classt & gt; Typename boost :: enable_if & lt; फुट :: is_member_function_pointer & LT; समारोह & gt; & Gt; :: प्रकार दुभाषिया :: register_function (std :: string const & amp; नाम, फ़ंक्शन एफ, क्लासटा * theclass); {टाइप-एफेड आमंत्रक & lt; फ़ंक्शन & gt; invoker; // इन्स्तावायर को नाम से नामित करें map_invokers [name] = boost :: bind (और invoker :: template apply_object & lt; fusion :: nil, classt & gt;, f, theclass, _1, संलयन :: शून्य ()); }  

इंटरप्रीटर :: इनवॉयर

  टेम्पलेट & lt; typename args, typename TheClass & gt; स्थिर इनलाइन शून्य apply_object (फ़ंक्शन फ़ंक्शन, द क्लास * द क्लास, पैरामीटर_ पार्सर और पार्सर, एआरजेस कंस एंड एग्ग्स) {टाइपिप्पिएफ टाइपनाम मेटल :: अगला & lt; से & gt; :: next_iter_type; Typedef दुभाषिया :: invoker & lt; फ़ंक्शन, next_iter_type, to & gt; invoker; Invoker :: लागू (फंक, पार्सर, फ्यूजन :: पुश_बैक (आर्ग्स, द क्लास)); }  

इस तरह, यह केवल पहली तर्क प्रकार को छोड़ देगा और सब कुछ सही ढंग से पार्स करेगा विधि को इस तरह से कहा जा सकता है: invoker.register_function ("SomeMethod", & amp; TheClass :: TheMethod, & amp; my_object);


Comments

Popular posts from this blog

c# - How to capture HTTP packet with SharpPcap -

jquery - SimpleModal Confirm fails to submit form -

php - Multiple Select with Explode: only returns the word "Array" -