अद्यतन: कुछ अतिरिक्त पढ़ने के बाद, जो मैं वास्तव में चाहता था उसे प्रारंभिक बाध्यकारी (जिसे गैर वर्चुअल फ़ंक्शंस और गैर-पीआईसी कोड के लिए तत्काल कॉल में अनुवादित किया जाना चाहिए) की गारंटी दी गई थी, जिसे एक (सदस्य) फ़ंक्शन पास करके किया जा सकता है एक टेम्पलेट पैरामीटर के रूप में। मेरी समस्या यह थी कि जीसीसी < 4.5 और आईसीसी 11.1 सदस्य फ़ंक्शन पॉइंटर टेम्पलेट पैरामीटर कॉल के लिए कुछ फंकी निर्देश उत्पन्न कर सकता है। AFAICT, gcc> = 4,5 और बनाम 2008 इन टेम्पलेट पैरामीटर को ठीक से कॉल करते हैं।सी ++ में फ़ंक्शन पता अक्षर कहाँ हैं?
सबसे पहले, शायद शाब्दिक इस अवधारणा के लिए सही शब्द नहीं है, लेकिन अपने निकटतम मैं (प्रथम श्रेणी के नागरिक के रूप में कार्य के अर्थ में नहीं शाब्दिक) के बारे में सोच सकता है।
callq <immediate address>
लेकिन अगर आप एक समारोह कॉल एक समारोह सूचक का उपयोग कर, यह कुछ इस तरह करने के लिए संकलित:
विचार है कि जब आप एक पारंपरिक समारोह कॉल करते हैं, यह कुछ इस तरह करने के लिए संकलित है
mov <memory location>,%rax
callq *%rax
जो सब ठीक है और अच्छा है। हालांकि, अगर मैं एक टेम्पलेट लाइब्रेरी लिख रहा हूं जिसके लिए निर्दिष्ट तर्क सूची के साथ किसी प्रकार की कॉलबैक की आवश्यकता है और लाइब्रेरी के उपयोगकर्ता को यह जानने की उम्मीद है कि वे संकलित समय पर किस फ़ंक्शन को कॉल करना चाहते हैं? फिर मैं टेम्पलेट पैरामीटर के रूप में फ़ंक्शन शाब्दिक को स्वीकार करने के लिए अपना टेम्पलेट लिखना चाहता हूं। तो, समान
कोtemplate <int int_literal>
struct my_template {...};`
मैं
template <func_literal_t func_literal>
struct my_template {...};
लिखने और my_template भीतर func_literal callq <immediate address>
को संकलित करने के लिए कॉल करना चाहते हैं।
क्या इसके लिए सी ++ में कोई सुविधा है, या एक ही प्रभाव प्राप्त करने के लिए आसपास एक काम है? यदि नहीं, तो क्यों नहीं (उदा। कुछ cataclysmic साइड इफेक्ट्स)? सी ++ 0x या दूसरी भाषा के बारे में कैसे?
यह विषय उपयोगी है, क्योंकि यह रन-टाइम के दौरान विभिन्न कार्यक्षमताओं को स्वैप करने की अनुमति देता है। उदाहरण के लिए, डॉस एपीआई कार्यों को मैप करने के लिए आईडी का उपयोग करता है। यह डीओएस कार्यक्षमता को कम से कम निष्पादन योग्य को प्रभावित करने की अनुमति देता है। लुकअप टेबल में बस सामग्री (फ़ंक्शन पते) को बदलें। –
टेम्पलेट्स के साथ संयोजन में फ़ंक्शंस संकलित-समय हैं। अधिकांश एसटीएल इस तरह काम करते हैं या आपकी समस्या में कोई चेतावनी है? – pmr
@pmr चेतावनी यह है कि समाधान उपयोगकर्ताओं के कोड पर कोई प्रभाव नहीं होना चाहिए; अगर वे फ़ंक्शन ऑब्जेक्ट्स का उपयोग नहीं कर रहे हैं, तो मैं उन्हें फ़ंक्शन ऑब्जेक्ट्स का उपयोग करने के लिए मजबूर नहीं करना चाहता हूं। – academicRobot