2010-11-03 23 views
6

डी में फ़ंक्शन घोषणा को देखते हुए, स्वचालित फ़ंक्शन प्रतिबिंब में उपयोग के लिए किसी भी फ़ंक्शन पैरामीटर नामों के स्ट्रिंग प्रस्तुति को संकलित समय पर आत्मनिरीक्षण करना संभव है। ईजी।डी: फ़ंक्शन पैरामीटर नाम आत्मनिरीक्षण

void foo(int a, double b, string c) { } 
register_function!(foo)() 

उसी तरह है कि एक वर्ग के लिए (allMembers, SomeClass) कर सकते हैं __traits में संकलन समय पर register_function सकते हैं निकालने "एक", "बी", "सी"?

+0

आपको इसके लिए क्या चाहिए? मैं नहीं देखता कि आपके उदाहरण के लिए इसकी आवश्यकता कैसे है। – BCS

उत्तर

3

मुझे लगता है कि स्ट्रिंगफ के उपयोगों में से एक नाम देता है। आप उन्हें थोड़ा सा काम से बाहर कर सकते हैं। ओटीओएच स्ट्रिंगफ बीमार परिभाषित है इसलिए यह थोड़ा भंगुर होगा।

+0

मैंने फ़ंक्शन पर स्ट्रिंग का उपयोग करने का प्रयास किया, और यह केवल इसके बारे में शिकायत करता है कि दिए गए तर्क प्रकार के साथ कॉल करने योग्य नहीं है। फ़ंक्शन कॉल पर स्ट्रिंगफ़ोफ़ का उपयोग फ़ंक्शन कॉल की स्ट्रिंग में इसके तर्कों के साथ होता है, पैरामीटर के नाम नहीं। इसलिए, यदि आपको फ़ंक्शन पैरामीटर के नाम देने के लिए स्ट्रिंगफ़ोफ़ प्राप्त करने का कोई तरीका है, तो मुझे नहीं पता कि यह क्या है। –

+2

@ जोनाथन: आपको इस प्रकार के 'स्ट्रिंगफ' को लागू करना होगा। यानी, यदि आप 'शून्य रजिस्टर_फंक्शन (टी) (टी एफ) परिभाषित करते हैं {auto a = T.stringof; } ', फिर एक कॉल' register_function (&foo); ''a ==" शून्य कार्य (int a, double b, string c) देता है "। बीसीएस इस स्ट्रिंग को पार्स करने का सुझाव देता है (जो निश्चित रूप से थोड़ा सा भंगुर है)। – stephan

+0

इस पर मदद के लिए धन्यवाद। यदि आप उपनाम टेम्पलेट पैरामीटर के माध्यम से फ़ंक्शन को पास करते हैं तो उपनाम पर स्ट्रिंगफॉफ़ एक त्रुटि देता है, हालांकि उपरोक्त बताए गए प्रकार का उपयोग करने से वास्तव में पूर्ण स्ट्रिंग मिलती है, जिसे मैं मैन्युअल रूप से पार्स करता हूं। मैन्युअल रूप से स्ट्रिंग को पार्स करना यदि जटिल हैं तो जटिल है या अगर घोषणा में केवल प्रकार होते हैं। मैं नामित फ़ंक्शन तर्कों के साथ कॉल करने योग्य उच्च स्तरीय इंटरफ़ेस में फ़ंक्शंस को स्वचालित रूप से पंजीकृत करने के लिए इसका उपयोग करता हूं। – John

4

पैरामीटर के प्रकार प्राप्त करने के लिए आप std.traits.ParameterTypeTuple!() का उपयोग कर सकते हैं, लेकिन मुझे उनके नाम प्राप्त करने के किसी भी तरीके से अवगत नहीं है। std.traits लगातार सुधार रहा है, हालांकि, मेरा जोड़ा गया। बाधाएं यह है कि इस पर काम करने वाले किसी भी व्यक्ति ने उस विशेष आवश्यकता के बारे में सोचा नहीं है, इसलिए उन्होंने इसे अभी तक नहीं जोड़ा है। मैं इसके लिए enhancement request बनाने का सुझाव दूंगा, और एक अच्छा मौका है कि वे इसे जोड़ देंगे।

+0

कृपया एक वृद्धि अनुरोध करें! यह बहुत उपयोग होगा एल बूस्ट। पायथन या लुबाइंड जैसे बाइंडिंग लाइब्रेरी बनाने के लिए। –

+1

चूंकि, मुझे जॉन के लिए कोई वृद्धि अनुरोध बनाने का कोई संकेत नहीं दिखाई देता है, मैंने एक बनाया है: http://d.puremagic.com/issues/show_bug.cgi?id=5175 –

+0

मेरे लिए यह अनुरोध आगे बढ़ाने के लिए बहुत बहुत धन्यवाद । – John

संबंधित मुद्दे