2010-05-04 20 views
6

मैं जानता हूँ कि जेनरिक एक भूमिका सी ++ टेम्पलेट्स के लिए इसी तरह पूरा करने के लिए सी # में हैं, लेकिन मैं वास्तव में संकलन समय पर कुछ कोड उत्पन्न करने के लिए कोई तरीका होना चाहिए - इस विशेष स्थिति में यह सी ++ टेम्पलेट के साथ समस्या को हल करने के लिए बहुत आसान होगा ।टेम्पलेट्स

किसी को भी किसी भी विकल्प के पता है? शायद एक वीएस प्लग-इन जो कोड को पूर्ववत करता है या ऐसा कुछ? इसे बहुत परिष्कृत होने की आवश्यकता नहीं है, मुझे बस संकलन समय पर कुछ तरीकों को उत्पन्न करने की आवश्यकता है।

यहां सी ++ में एक बहुत ही सरल उदाहरण है (ध्यान दें कि इस विधि को केवल "उन्नत" की बजाय विभिन्न स्थितियों के साथ एक तंग लूप के अंदर बुलाया जाएगा और उन स्थितियों में प्रति फ्रेम केवल एक बार बदल जाएगा - अगर यह बहुत धीमा और लिखना होगा हाथ से सभी वैकल्पिक तरीकों को बनाए रखना असंभव होगा)। यह भी ध्यान रखें कि प्रदर्शन बहुत महत्वपूर्ण है और यही कारण है कि मुझे संकलन समय पर उत्पन्न होने की आवश्यकता है।

template <bool Advanced> 
int TraceRay(Ray r) 
{ 
    do 
    { 
     if (WalkAndTestCollision(r)) 
     { 
      if (Advanced) 
       return AdvancedShade(collision); 
      else 
       return SimpleShade(collision); 
     } 
    } 
    while (InsideScene(r)); 
} 
+1

जिज्ञासा से, क्या आप सी ++ टेम्पलेट का एक कोड उदाहरण प्रदान कर सकते हैं जिसका आप उपयोग करेंगे? एक वैकल्पिक दृष्टिकोण हो सकता है जो आप सी # में जो चाहते हैं उसे पूरा कर सकता है। –

+0

एक साधारण उदाहरण जोड़ा गया। –

+0

ध्यान रखें, सी # एक जेआईटी कंपाइलर का उपयोग करता है। तो "रन टाइम" पर मूल्यांकन किए जाने वाले बयान भी जेआईटी द्वारा संकलित कोड में अनुकूलित हो सकते हैं, जब तक कि यह निर्धारित किया जा सके कि केवल एक ही रास्ता लिया जाएगा। इसके अलावा, यदि आप इस स्तर के प्रदर्शन की परवाह करते हैं, तो आपको पहले स्थान पर प्रबंधित कोड का उपयोग नहीं करना चाहिए। –

उत्तर

9

आप T4 उपयोग कर सकते हैं चाहते हैं।

संपादित करें: अपने उदाहरण में, आप एक साधारण bool पैरामीटर का उपयोग कर सकते हैं।

+0

+1: यह शायद अब तक प्रस्तुत सबसे अधिक सुविधा युक्त विकल्प है। (हालांकि कुछ स्पष्टीकरण भी मदद करेगा;)) –

+0

टी 4 ऐसा लगता है जो मैं चाहता हूं, धन्यवाद! यह सी ++ टेम्पलेट्स के रूप में लगभग उतना ही साफ नहीं है, लेकिन यह सिर्फ एक बाधा वर्ग है इसलिए मैं शायद इसके साथ जा रहा हूं। –

1

वास्तव में, जहां तक ​​मुझे पता है। आप क्रम, ज़ाहिर है पर बात के इस प्रकार कर सकते हैं; कुछ मेटा प्रोग्रामिंग विकल्प, तुच्छ उनमें से कोई भी:

  • प्रतिबिंब (सबसे आसान विकल्प आप की जरूरत नहीं है, तो "सबसे तेज संभव")
  • CSharpCodeProvider और कुछ कोड पीढ़ी
  • CodeDom के साथ एक ही
  • ILGenerator आप कट्टर
+0

इसके अलावा पोस्टशर्प (www.sharpcrafters.com) एक ही श्रेणी में है और इसका उपयोग किया जा सकता है। – cfeduke

+0

दुर्भाग्यवश प्रदर्शन आवश्यक है इसलिए इसे संकलन समय पर उत्पन्न किया जाना चाहिए। –

0

जेनेरिक्स, टेम्पलेट्स के रूप में काम करता है, तो ऐसा होता है कि। क्रम में कोड बनाने के लिए एक तरीका है -

चेक CodeProject उदाहरण:

CodeProject

+0

वह संकलन समय पर ऐसा करना चाहता है। – SLaks

0

मार्क उत्तम सुझाव के लिए इसके अलावा, आप PostSharp पर एक नजर है कर सकते हैं। (, साथ ही कुछ और पागल सामान के लिए ILGenerator का उपयोग कर लेने और अब मैं System.Linq.Expressions का उपयोग कर गतिशील कोड पीढ़ी का उपयोग कर रहा) स्थिर जेनरिक कि प्रतिबिंब का उपयोग का उपयोग कर शैली चाल -

0

मैं कुछ मेटा प्रोग्रामिंग किया है। उदाहरण के लिए http://www.lordzoltan.org/blog/post/Pseudo-Template-Meta-Programming-in-C-Sharp-Part-2.aspx एक साथ रखा गया है (कोड स्वरूपण की कमी के बारे में खेद है - यह एक बहुत पुरानी पोस्ट है!) जो कि उपयोग की जा सकती है। के रूप में SLaks ने सुझाव दिया, -

मैं भी T4 (ओलेग Sych लिंक टी -4 पर मेरी पसंदीदा प्राधिकारी द्वारा ट्यूटोरियल की एक श्रृंखला को जाता है) - का उपयोग किया है जो वास्तव में एक अच्छा तरीका कोड उत्पन्न करने के लिए है, खासकर यदि आप भी कर रहे हैं Asp.Net-style वाक्यविन्यास के साथ आरामदायक। यदि आप टी 4 आउटपुट का उपयोग करके आंशिक कक्षाएं उत्पन्न करते हैं, तो डेवलपर तब सजा सकता है और कक्षा में जोड़ सकता है, हालांकि वे फिट दिखाई देते हैं।

यदि इसे पूरी तरह से संकलन-समय होना है - तो मैं टी 4 के लिए जाऊंगा (या अपना खुद का कस्टम टूल लिखूंगा, लेकिन यह थोड़ा भारी है)। यदि नहीं, तो एक स्थैतिक जेनेरिक शायद मार्क द्वारा उल्लिखित समाधानों के साथ साझेदारी में मदद कर सकता है।

0

यदि आप सही कोड पीढ़ी चाहते हैं, तो आप कोडस्मिथ http://www.codesmithtools.com का उपयोग कर सकते हैं जो टी 4 की तरह मुफ्त/शामिल नहीं है, लेकिन इसमें कुछ और सुविधाएं हैं, और वीएस.NET प्लग-इन के रूप में कार्य कर सकती हैं।

0

यहाँ एक पुराने लेख आनुवंशिक प्रोग्रामिंग का उपयोग करता है पैदा करते हैं और मक्खी पर कोड को संकलित करने के लिए:

http://msdn.microsoft.com/en-us/magazine/cc163934.aspx

"जेनरेटर वर्ग आनुवंशिक प्रोग्रामिंग आवेदन की गिरी है यह उपलब्ध आधार वर्ग टर्मिनलों और पता चलता है। यह समस्या उत्पन्न करने के लिए एक अच्छा समाधान खोजने के लिए सी # कोड उत्पन्न करता है, संकलित करता है और निष्पादित करता है। कन्स्ट्रक्टर को सिस्टम सिस्टम पास किया जाता है। टाइप करें जो .NET प्रतिबिंब संचालन के लिए रूट क्लास है। "

आपकी स्थिति के लिए अधिक हो सकता है, लेकिन यह दिखाता है कि सी # क्या कर सकता है। (ध्यान दें कि यह आलेख 1.0 दिनों से है)

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