2009-03-03 12 views
8

में रनटाइम पर टेम्पलेट तर्क का चयन करें मान लीजिए कि मेरे पास एकल (float) या double परिशुद्धता का उपयोग करने के लिए टेम्पलेट किए गए कार्यों और वर्गों का एक समूह है। बेशक मैं बूटस्ट्रैप कोड, या मैक्रोज़ के साथ गड़बड़ की सिर्फ दो टुकड़े लिख सकते हैं। लेकिन मैं सिर्फ कार्यावधि में टेम्पलेट तर्क स्विच कर सकते हैं?सी ++

उत्तर

19

नहीं, आप, कार्यावधि में टेम्पलेट तर्क परिवर्तन नहीं कर सकते क्योंकि टेम्पलेट्स संकलन समय पर संकलक द्वारा instantiated कर रहे हैं। क्या आप कर सकते हैं करते हैं, दोनों टेम्पलेट्स एक आम आधार वर्ग से निकाले जाते हैं हमेशा अपने कोड में आधार वर्ग का उपयोग करें, और फिर निर्णय जो रनटाइम पर उपयोग करने के लिए वर्ग प्राप्त होता है:

class Base 
{ 
    ... 
}; 

template <typename T> 
class Foo : public Base 
{ 
    ... 
}; 

Base *newBase() 
{ 
    if(some condition) 
     return new Foo<float>(); 
    else 
     return new Foo<double>(); 
} 

मैक्रो एक ही समस्या के रूप में है टेम्पलेट्स, कि वे संकलन समय पर विस्तार किया गया है।

3

टेम्पलेट्स एक संकलन समय तंत्र हैं। Btw, मैक्रो रूप में अच्छी तरह कर रहे हैं (सख्ती से बोला - एक पूर्व प्रसंस्करण तंत्र - कि यहां तक ​​कि संकलन से पहले आता है)।

2

टेम्पलेट्स पूरी तरह से एक संकलन समय निर्माण कर रहे हैं, संकलक एक टेम्पलेट का विस्तार करेगा और निर्दिष्ट तर्क के साथ अपनी कक्षा/समारोह बनायेगा और सीधे कोड को अनुवाद करेगा।

यदि आप रनटाइम पर foo<float> और foo<double> के बीच स्विच करने का प्रयास कर रहे हैं, तो आपको या तो कुछ मेटाप्रोग्रामिंग ट्रिकरी का उपयोग करने की आवश्यकता होगी या प्रत्येक के लिए अलग कोड पथ होंगे।