c++ - Pass overloaded member function to a variadic template function -
मेरे पास फ़ंक्शन जोड़ के साथ एक वर्ग है:
कक्षा पूल {सार्वजनिक: पूल () {}; टेम्पलेट & lt; कक्षा F, कक्षा ... A & gt; ऑटो जोड़ (एफ एंड amp; एफ, ए और amp; ... args) - & gt; Std :: भविष्य & lt; typename std :: result_of & lt; एफ (ए ...) & gt; :: प्रकार & gt; {// रिक्त प्लेसहोल्डर को इस कोड के उदाहरण के लिए, उदाहरण के लिए std :: future & lt; typename std :: result_of & lt; एफ (ए ...) & gt; :: type & gt; सेवानिवृत्त; रिटर्न रिट; }; };
इसे किसी भी कार्य को उसके तर्कों के साथ लेना चाहिए, इसे थ्रेड पूल में जोड़कर उस फ़ंक्शन के परिणाम प्रकार के भविष्य को वापस करना होगा।
और एक वर्ग जहां मैं इसका प्रयोग करें:
वर्ग MyClass {सार्वजनिक: स्ट्रिंग doIt (स्ट्रिंग) {रिटर्न स्ट्रिंग ("a"); }; स्ट्रिंग doIt (int, string) {वापसी स्ट्रिंग ("b"); }; शून्य परीक्षण () {पूल myPool; स्ट्रिंग ए ("टेस्ट"); MyPool.add (& MyClass :: doIt, ए); // त्रुटि}; };
जो एक कंपाइलर त्रुटि देता है:
त्रुटि 1 त्रुटि C2914: 'पूल :: add': फ़ंक्शन तर्क के रूप में टेम्पलेट तर्क का आकलन नहीं कर सकता है अस्पष्ट MyClass सीपीपी 94
अब समस्या है (मुझे लगता है) कि कंपाइलर का उपयोग करना चाहते हैं जो अधिभार निकालना नहीं कर सकता। के समान । (इसके अलावा, मैं 100% स्पष्ट नहीं हूं कि मुझे क्लास सदस्य कार्यों के लिए "और" का उपयोग क्यों करना है, लेकिन अगर मैं एक स्वतंत्र फ़ंक्शन में पास नहीं होता है)। वैसे भी मैंने ऊपर दिए गए उत्तर में उल्लेखित समाधान की भी कोशिश की:
struct doIt_wrapper {टेम्पलेट & lt; typename ... T & gt; ऑटो ऑपरेटर () (टी ... आर्ग्स) - & gt; गिरावट (doIt (आर्ग्स ...)) {वापसी doIt (आर्ग्स ...); }};
और उसके बाद MyClass :: test () को संशोधित करना:
शून्य परीक्षण () {पूल myPool; स्ट्रिंग ए ("टेस्ट"); MyPool.add (doIt_wrapper (), ए); };
लेकिन यह मुझे एक कंपाइलर त्रुटि भी देता है:
त्रुटि C2893: फ़ंक्शन टेम्पलेट को विशेषज्ञ करने में विफल 'अज्ञात-प्रकार doIt_wrapper :: ऑपरेटर (टी) ...) 'सी: \ प्रोग्राम फ़ाइलें (x86) \ माइक्रोसॉफ्ट विज़ुअल स्टूडियो 12.0 \ वीसी \ में शामिल करें \ xrefwrap 58
मैंने भी कुछ वैरिएन्ट की कोशिश की जैसे myPool.add ( DoIt_wrapper & lt; स्ट्रिंग & gt; ()
और के साथ / बिना & amp;; लेकिन वे सभी एक या अन्य कंपाइलर त्रुटि उत्पन्न करते हैं।
मुझे लगता है कि मैं अभी तक समस्या को पूरी तरह समझ नहीं पा रहा हूं और मैं अगर कोई इस पर प्रकाश डाल सकता है तो खुश रहो। इसके अलावा, मैं इस समस्या का उचित समाधान तलाश रहा हूं। यह वास्तव में ऐसा नहीं हो सकता है कि यह केवल तब तक काम करता है जब तक कि एक ही नाम के साथ कोई दो कार्य न हो, और जल्द ही जैसा कि कोई भी हो, सब कुछ एक उचित, सामान्य समाधान के बिना टूट जाता है?
संपादित करें: कुछ टाइपो तय किए गए हैं और यहां एक न्यूनतम उदाहरण अपलोड किया गया है:
आप लैम्ब्डा का उपयोग कर सकते हैं:
myPool.add ([this] (const std :: स्ट्रिंग और ए एमपी; S) {doIt (s);}, a);
या यहां तक कि
myPool.add ([यह, एक] () {doIt (a);});
वर्तमान में, आप यह इंगित कर सकते हैं कि किस अधिभार का उपयोग करें:
myPool.add (static_cast & lt; std :: string (MyClass :: *) ( Std :: string) & gt; (& MyClass :: doIt), ए);
ध्यान दें कि doIt
एक विधि (एक नि: शुल्क कार्य या स्थिर कार्य नहीं है), इसलिए आपको किसी ऑब्जेक्ट से इसे कॉल करना होगा। यदि आप स्थिर
से doIt
जोड़ते हैं, तो आप अधिभार को
से चुन सकते हैं myPool.add (static_cast & lt; std :: string (*) (Std :: स्ट्रिंग) & gt; (& MyClass :: doIt), ए);
Comments
Post a Comment