के रूप में कहा स्वीकार किए जाते हैं जवाब में, समस्या यह है कि प्रकार हस्ताक्षर अलग है - एक std::deque<T>
के लिए, push_back
केवल एक अधिभार कि T const&
स्वीकार करता है और सीधे नहीं T
है। typedef void (deque<int>::*func_ptr)(const int &)
इसे लिखने के लिए एक बिल्कुल संक्षिप्त और क्रांतिकारी तरीका है।
मैं ऐसा करने के लिए एक सी ++ 11 तरीके को संबोधित करना चाहता था - उपनाम टाइप करें। सबसे पहले आश्चर्य हो सकता है कि "auto
का उपयोग क्यों नहीं करें?" यह संभव नहीं है क्योंकि फ़ंक्शन का उपयोग किया जा रहा है एक अधिभारित फ़ंक्शन है, और auto
नहीं जानता कि किस ओवरलोड को एक्सेस करना है। चूंकि मूल प्रश्न फ़ंक्शन प्रकार के ज्ञान को void(int)
पर एम्बेड करता है, इसलिए कथन &deque<int>::push_back
सही अधिभार का चयन करता है। सरल कथन के साथ समस्या यह है कि यह कंटेनर और उस प्रकार के ज्ञान के ज्ञान में बेक है। यदि आप std::vector
में बदलना चाहते हैं, या int
से short
पर बदलना चाहते हैं, तो आपको सभी नए प्रकार बनाना होगा। प्रकार उपनाम के साथ, हम embedding प्रकार ज्ञान से बचने के लिए सब कुछ templatize कर सकते हैं:
using func_ptr = void(Cont::*)(typename Cont::const_reference);
हम कुछ सरल, के रूप में पहले कर सकते हैं:
func_ptr<deque<int>> fptr = &deque<int>::push_back;
... या हम कहीं न कहीं एक कंटेनर का उल्लेख कर सकते हैं:
vector<short> container;
... संकलन समय पर अपने प्रकार को देख, और इसकी push_back
कार्य करने के लिए एक सूचक भंडारण, सभी की देखभाल क्या कंटेनर है बिना:
using container_type = decltype(container);
func_ptr<container_type> fptr2 = &container_type::push_back;
आपके द्वारा लिंक किए गए व्याख्यान नोट्स अब सार्वजनिक रूप से सुलभ नहीं हैं। – ti7
@ ti7 मैं अभी भी इसे एक्सेस करने में सक्षम हूं। – harman786