Şablon bağımsız değişkeninin typedef'ini kullanan bir kod yazmayı deniyorum, ancak şablon argümanı bu typedef yoksa bir varsayılan tür sağlamak istiyorum.Sınıf üyesi typedef yoksa varsayılan türünü kullanmak için şablon uzmanlığı
struct DefaultType { DefaultType() { printf("Default "); } };
struct NonDefaultType { NonDefaultType() { printf("NonDefault "); } };
struct A {};
struct B { typedef NonDefaultType Type; };
template<typename T, typename Enable = void> struct Get_Type {
typedef DefaultType Type;
};
template<typename T> struct Get_Type< T, typename T::Type > {
typedef typename T::Type Type;
};
int main()
{
Get_Type<A>::Type test1;
Get_Type<B>::Type test2;
}
bu "Varsayılan varsayılan olmayan" yazdırmak için beklenir, ama bunun yerine "Standart" yazdırır: denedim bir basitleştirilmiş bir örnek şudur. Beklentim, ana() 'deki ikinci satırın, B :: Türünün mevcut olması nedeniyle Get_Type'ın özelleştirilmiş sürümüyle eşleşmesidir. Ancak, bu gerçekleşmez.
Burada neler olup bittiğini ve nasıl düzeltileceğini veya aynı amacı gerçekleştirmenin başka bir yolunu herkes anlatabilir mi?
Teşekkür ederiz.
Düzenleme:
Georg alternatif bir yöntem verdi ama hala bu neden çalışmıyor merak ediyorum. Gerçek enable_if <> bir typedef gibi yazması çünkü
template <class T, class Enable = void>
class A { ... };
template <class T>
class A<T, typename enable_if<is_integral<T> >::type> { ... };
template <class T>
class A<T, typename enable_if<is_float<T> >::type> { ... };
Bu çalışır, ancak < yanlış> enable_if yapmaz: dokümanlar enable_if boost göre, farklı türleri için bir şablon uzmanlaşmak için bir yol öylesine gibidir.
Bunun sürümümden farklı olduğunu anlamıyorum, nerede enable_if kullanmak yerine doğrudan T :: Type kullanıyorum. T :: Type mevcut ise yukarıdaki örnekte enable_if < true> :: type ile aynı olmaz ve uzmanlığın seçilmesine neden olmaz mı? Ve eğer T :: Type yoksa, enable_if < false> :: type ile aynı olmaz ve yukarıdaki örnekte varsayılan versiyonun seçilmesine neden olmaz mı?
template<class T> struct has_type {
template<class U> static char (&test(typename U::Type const*))[1];
template<class U> static char (&test(...))[2];
static const bool value = (sizeof(test<T>(0)) == 1);
};
template<class T, bool has = has_type<T>::value> struct Get_Type {
typedef DefaultType Type;
};
template<class T> struct Get_Type<T, true> {
typedef typename T::Type Type;
};
Ah ait
always
.. hedefimiz nedir kullanabilir? –Hedef, Get_Type :: Type varsa T: Type, yoksa mevcut değilse DefaultType olacaktır. –
Frank