2011-08-04 14 views
5

क्या किसी भी प्रकार से टेम्पलेटेड फ़ंक्शन का उपयोग उन प्रकारों के लिए करना संभव है जिनके लिए विशेषज्ञता स्पष्ट रूप से लिखी नहीं गई थी। मुझे लगता है किब्लॉक गैर-विशिष्ट टेम्पलेट सी ++

template <typename T> 
void foo(){} 

template <> 
void foo<int>(){} 

int main(int argc, char* argv[]){ 
    foo<int>(); //ok 
    foo<char>(); //Wrong - no specialized version for char. 
} 

की तरह कुछ मतलब मैं समारोह के जेनेरिक वर्जन को छोड़ नहीं कर सकते, कारण तो संकलक का कहना है, कि foo एक टेम्पलेट समारोह जब मैं विशेषज्ञ करने की कोशिश नहीं है। मैं बस कुछ ऐसा लिख ​​सकता हूं जो जेनेरिक फ़ंक्शन में संकलित नहीं होता है, और कुछ टिप्पणी जोड़ता है कि क्यों, लेकिन यह काफी जानकारीपूर्ण नहीं होगा। मैं क्या करना चाहता हूं, संकलन को सीधे "foo() परिभाषित नहीं किया गया है जैसे त्रुटि के साथ जाने में सक्षम होना है"।

उत्तर

13

ज़रूर: बस इसे परिभाषित नहीं करते हैं और आप एक लिंकर त्रुटि मिलेगी अगर आप इसे इस्तेमाल करने की कोशिश:

template <typename T> 
void foo(); // not defined 

template <> 
void foo<int>() { } 

वैकल्पिक रूप से, आप एक "अच्छे देने के लिए एक स्थिर ज़ोर के कुछ बदलाव उपयोग कर सकते हैं "संकलन समय त्रुटि। यहां C++ 0x static_assert का उपयोग करके एक उदाहरण दिया गया है। ध्यान दें कि आपको टेम्पलेट पैरामीटर पर निर्भर false मान बनाना होगा, अन्यथा static_assert टेम्पलेट को पार्स किए जाने पर ट्रिगर किया जा सकता है।

template <typename T> 
struct dependent_false { enum { value = false }; }; 

template <typename T> 
void foo() 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
} 

ध्यान दें कि यह आमतौर पर सबसे अच्छा not to specialize function templates है। इसके बजाए, एक विशेष श्रेणी टेम्पलेट में प्रतिनिधि होना बेहतर होता है:

template <typename T> 
struct foo_impl 
{ 
    static_assert(dependent_false<T>::value, "Oops, you used the primary template"); 
}; 

template<> 
struct foo_impl<int> 
{ 
    static void foo() { } 
}; 

template <typename T> 
void foo() 
{ 
    return foo_impl<T>::foo(); 
} 
4

निश्चित रूप से, डिफ़ॉल्ट जेनेरिक टेम्पलेट के लिए परिभाषा की आपूर्ति न करें।

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