dribeas 'जवाब जहाँ तक आधुनिक सी ++ का संबंध है सही है।
ब्याज के लिए, वहाँ भी सी दुनिया है कि जहाँ तक यह जाता है, सी में काम करता है से एक सरल लो तकनीक समाधान है ++। मनमाने ढंग से पैरामीटर की अनुमति देने के बजाय, फ़ंक्शन को void (*func)(void*)
के रूप में परिभाषित करें, और "पैरा" void*
बनाएं। इसके बाद कॉलर का काम कुछ संरचना को परिभाषित करने के लिए है जिसमें पैरामीटर होंगे, और इसके जीवन चक्र का प्रबंधन होगा। आमतौर पर फोन करने वाले भी समारोह है कि वास्तव में कहा जा करने के लिए आवश्यक है के लिए एक सरल आवरण लिखना होगा:
void myfunc(int, float); // defined elsewhere
typedef struct {
int foo;
float bar;
} myfunc_params;
void myfunc_wrapper(void *p) {
myfunc_params *params = (myfunc_params *)p;
myfunc(params->foo, params->bar);
}
int main() {
myfunc_params x = {1, 2};
AddTimer(23, 5, myfunc_wrapper, &x);
sleep(23*5 + 1);
}
अभ्यास में आप के लिए "आग और भूल जाओ" चाहते टाइमर, इसलिए यदि आप इस योजना का उपयोग आप भी एक तरह से आवश्यकता हो सकती है एक बार सभी फायरिंग पूरा हो जाने के बाद टाइमर उपयोगकर्ताडेटा पॉइंटर को मुक्त करने का प्रबंधन करता है।
जाहिर है इस सीमित प्रकार का सुरक्षा है। सिद्धांत रूप में कोई फर्क नहीं पड़ता, क्योंकि जो कोई भी फ़ंक्शन पॉइंटर और उपयोगकर्ता डेटा पॉइंटर प्रदान करता है, उसे यह सुनिश्चित करने में कठिनाई नहीं होनी चाहिए कि वे मेल खाते हैं। निश्चित रूप से लोगों को बग लिखने के तरीके मिलते हैं, और आपको दोष देने के तरीके मिलते हैं क्योंकि उनके कंपाइलर ने उन्हें बग के बारे में नहीं बताया ;-)
स्रोत
2011-01-29 16:28:18
कॉल केवल तभी कार्य करेगा? – Ninja
@ निंजा हां बिल्कुल। कॉलर के रूप में, यदि आप यह भी नहीं जानते कि रिटर्न प्रकार क्या है, तो आप फ़ंक्शन का उपयोग कैसे कर सकते हैं? आप 'boost :: function' का उपयोग कर सकते हैं और वापसी प्रकार को अपनी इच्छित चीज़ों में डाल सकते हैं। यदि आप आधुनिक सी ++ विकल्प चाहते हैं, तो आप कुछ प्रकार के एरर के साथ खेलने के लिए 'boost :: function ' का उपयोग कर सकते हैं। –
kizzx2