2011-01-06 29 views
11

Özel şablon sınıfından özel olmayan şablon sınıfında tanımlanan bir işlevi çağırmak mümkün mü? Aşağıda, denemeye çalıştığım şeyin bir örneği verilmiştir:Özel şablon sınıfı işlevinden özel olmayan şablon sınıfı işlevini çağırın

GCC, uzman olmayan sınıf işlevini göremeyeceğinden şikayetçidir; Yani sanırım sadece özel sınıfın içinde görünüyor.

Herhangi bir düşünce? toString(), countDigits(), vb Ben - Ben başka işlevlere sahip

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);  
    } 
}; 

: Burada DÜZENLEME

daha somut (olası bir çözüm ile) benim kodundan örnektir Bu yaklaşımı seçtiğim için her tip için aynı işlev isimlerini saklayabilirim (yani toStringU32(), toString32, vb.). Şablon uzmanlığını düşündüm ama bunun mümkün olduğuna inanmıyorum.

+1

? Diğer bir deyişle, tek yapmanız gereken uzman olmayan versiyonu çağırıyorsa, neden uzmanlaşmak için ihtiyacınız var? –

+0

'T' türünün statik yöntem üzerinde hiçbir etkisi yoktur - neden ilk etapta orada? Bu bir şablon kötüye kullanımı örneğine benziyor, neden sadece aşırı serbest fonksiyonlara sahip değilsiniz? – Nim

+0

Daha somut örnekle güncellenmiş gönderi. – Graeme

cevap

10

Genel olarak, bu mümkün değildir.

Farklı olası çözümler vardır, ancak “aldatırlar”. Birincisi, gerçek varsayılan mantığı, özel bir değil değil, farklı bir işleve çıkarmaktır. Artık bu işlevi hem toString uygulamalarından çağırabilirsiniz.

ikinci alternatif olmayan uzman sınıfından miras ve şablon argüman olarak özel bir etiket geçen gerektirir: Neden fonksiyonun özel sürümden olmayan uzman sürümünü aramaya çalışıyoruz

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); 
} 
}; 
İlgili konular