2009-10-23 7 views
6

मैं हाल ही में डी भाषा के साथ खेल रहा हूं और मेरे पास टेम्पलेट्स के बारे में एक त्वरित सवाल है।कुछ डी टेम्पलेट प्रश्न

मैं कोड में एक मौजूदा स्ट्रिंग में वर्ण और तार डालने कर रहा हूँ और इस समारोह के साथ आया था:

string insert(T)(string s1, T s2, uint position) { 
    return s1[0 .. position] ~ s2 ~ s1[position .. $]; 
} 

अब, मैं कई प्रश्न हैं।

  1. मैं प्रकार s2 तर्क के लिए अनुमति दी सीमित कर सकते हैं (मैं केवल चार, wchar, dchar, आदि और उनके संबंधित सरणी मूल्यों चाहते हैं)?

  2. क्या स्थिति तर्क 0 है तो प्रीपेन्ड करने के लिए स्वचालित रूप से टेम्पलेट को परिभाषित करने का कोई तरीका है? कुछ इस तरह (जो संकलन नहीं है, लेकिन सामान्य विचार देता है):

    string insert(T)(string s1, T s2, uint position) { 
        static if (position == 0) 
        return "" ~ s2 ~ s1; 
        else 
        return s1[0 .. position] ~ s2 ~ s1[position .. $]; 
    } 
    

धन्यवाद

+0

स्टैक ओवरव्लो सोच रहा है कि आपका दूसरा कोड ब्लॉक बिंदु 2 के लिए एक नया पैराग्राफ है। –

उत्तर

4
  1. हाँ - या तो template parameter specialization या template constraints (सी ++ 1x अवधारणाओं के समकक्ष)।
  2. static if का तात्पर्य है कि इस स्थिति की गणना संकलन समय पर की जा सकती है। एक फ़ंक्शन पैरामीटर नहीं हो सकता है, इसलिए या तो नियमित if का उपयोग करें या position टेम्पलेट पैरामीटर बनाएं।
+0

आप टेम्पलेट पैरामीटर 'स्थिति' बनाने के बारे में कैसे जाते हैं? निम्नलिखित की तरह कुछ? स्ट्रिंग डालने (टी, यूआईंट स्थिति) (...) { स्थैतिक अगर (स्थिति == 0) ... और ... } – GKelly

+0

अनिवार्य रूप से, मैं यहां जितना संभव हो उतना रन-टाइम निर्णय लेने से बचने का एक तरीका ढूंढ रहा हूं, इसलिए मैं यह देखने की कोशिश कर रहा हूं कि मैं 'सामान्य' से बच सकता हूं या नहीं। ईमानदार होने के लिए, मैं सिर्फ भाषा की खोज कर रहा हूं, अगर मैं सामान्य रूप से गैर स्थैतिक के साथ पर्याप्त खुश हूं, लेकिन मैं बस यह खोज रहा हूं कि क्या संभव है। – GKelly

+0

@ पहला सवाल: हां। –

0

2 के रूप में, आप सिर्फ एक सामान्य अगर कथन का उपयोग नहीं कर सकते?

1

1 के लिए, वास्तव में दो स्थानों पर आप स्वीकार्य प्रकारों को प्रतिबंधित कर सकते हैं।

पहला विधि चयन से पहले है। यदि कोई प्रतीक कई तरीकों से हल हो जाता है, तो संकलक इसे जितना प्रयास कर सकता है उसे खत्म करने का प्रयास करेगा और यह तय करेगा कि किस का उपयोग करना है। इस चरण में टेम्पलेट बाधाएं (केवल डी 2) और विशेषज्ञता कार्य। उदाहरण के लिए:

string insert(T)(string s1, T s2, uint position) if(isSomeChar!T) // D2 only 

-या-

string insert(T : dchar)(string s1, T s2, uint position) // D1 or D2 

अन्यके बाद विधि चयन है। यह वह जगह है जहां संकलक ने पहले ही इस विशिष्ट विधि का उपयोग करने का निर्णय लिया है। आप स्थिर आवेषण के साथ ऐसा कर सकते हैं। ध्यान दें कि यह संकलक को "ओह" नहीं जाने का कारण बनता है; मुझे एक अलग अधिभार की तलाश करनी चाहिए! "; यह बस छोड़ देगा।

string insert(T)(string s1, T s2, uint position) 
{ 
    static if(!isSomeChar!(T)) 
    { 
     pragma(msg, "Error: insert(T): T must be a character type."); 
     static assert(false); 
    } 
    ... 
} 

एक अन्य बात: जहाँ तक मैं वाकिफ हूँ, आप ** नहीं * बस wchars और dchars एक स्ट्रिंग में जोड़ सकते हैं (जो वर्ण की एक सरणी है)। आपको पहले अक्षर को स्ट्रिंग में एन्कोड करने की आवश्यकता होगी। std.utf मॉड्यूल में चाल चलनी चाहिए।

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