2011-01-06 26 views
11

से गैर विशिष्ट टेम्पलेट क्लास फ़ंक्शन को कॉल करें क्या एक विशेष टेम्पलेट क्लास से गैर-विशिष्ट टेम्पलेट क्लास में परिभाषित फ़ंक्शन को कॉल करना संभव है? यहां एक उदाहरण दिया गया है कि मैं क्या प्रयास कर रहा हूं:विशिष्ट टेम्पलेट वर्ग फ़ंक्शन

template <typename T> 
struct Convert 
{ 
static inline void toString(unsigned num, unsigned places, std::string& str) { ... } 
}; 

template <> 
struct Convert<int8_t> 
{ 
static inline void toString(unsigned num, std::string& str) 
{ 
    Convert<int8_t>::toString(num, digitis(num), str); 
} 
}; 

जीसीसी शिकायत करता है कि यह गैर-विशिष्ट वर्ग समारोह नहीं देख सकता है; यानी मुझे लगता है कि यह केवल विशेष वर्ग के भीतर दिखता है।

किसी भी विचार?

संपादित

यहाँ मेरी कोड से एक और अधिक ठोस उदाहरण (एक संभव समाधान के साथ):

struct NonSpecial { }; 

template <typename T> 
class Convert 
{ 

     template <typename R> 
     static inline R fromString(const register char *str, const unsigned str_len) 
     { 
      R result = 0; 
      //convert str to R 
      return result; 
     } 

     friend class Convert<int8_t>; 
     friend class Convert<uint8_t>; 
} 

template <> 
struct Convert<int8_t>  
{ 
    static inline int8_t fromString(const register char* str, const unsigned str_len = 4) 
    { 
     Convert<NonSpecial>::fromString<int8_t>(str, str_len);  
    } 
}; 

template <> 
struct Convert<uint8_t>  
{ 
    static inline uint8_t fromString(const register char* str, const unsigned str_len = 3) 
    { 
     Convert<NonSpecial>::fromString<uint8_t>(str, str_len);  
    } 
}; 

मैं अन्य कार्यों है - toString(), countDigits(), आदि मैं इस दृष्टिकोण को चुना है ताकि मैं प्रत्येक प्रकार के लिए समान फ़ंक्शन नाम रख सकूं (यानी ToStringU32(), toString32, आदि की आवश्यकता नहीं है)। मैंने टेम्पलेट विशेषज्ञता पर विचार किया लेकिन मुझे विश्वास नहीं है कि यह संभव है।

+1

तुम क्यों समारोह के विशेष संस्करण से गैर विशेष संस्करण कॉल करने के लिए कोशिश कर रहे हैं? दूसरे शब्दों में, यदि आप जो भी कर रहे हैं वह गैर-विशिष्ट संस्करण को कॉल कर रहा है, तो आपको इसे विशिष्ट होने की आवश्यकता क्यों है? –

+0

प्रकार 'टी' का स्थिर तरीका पर कोई असर नहीं है - यह पहले स्थान पर क्यों है? यह टेम्पलेट दुरुपयोग के मामले की तरह दिखता है, आप बस मुफ्त कार्यों को अधिभारित क्यों नहीं करते हैं? – Nim

+0

अधिक ठोस उदाहरण के साथ अद्यतन पोस्ट। – Graeme

उत्तर

10

सामान्यतः, यह संभव नहीं है।

विभिन्न संभावित समाधान हैं लेकिन वे "धोखा" हैं। सबसे पहले वास्तविक डिफ़ॉल्ट तर्क को विशिष्ट फ़ंक्शन में उतारना है। अब आप इस फ़ंक्शन को toString कार्यान्वयन दोनों से कॉल कर सकते हैं।

दूसरा विकल्प गैर विशेष वर्ग से इनहेरिट और टेम्पलेट तर्क के रूप में एक विशेष टैग गुजर जरूरत पर जोर देता:

struct BaseClassTag { }; 

template <> 
struct Convert<int8_t> : public Convert<BaseClassTag> 
{ 
typedef Convert<BaseClassTag> TBase; 
static inline void toString(unsigned num, std::string& str) 
{ 
    TBase::toString(num, digitis(num), str); 
} 
}; 
संबंधित मुद्दे