2011-04-02 12 views

cevap

14
template <typename T> 
struct pointer_depth_impl 
{ 
    enum { value = 0 }; 
}; 

template <typename T> 
struct pointer_depth_impl<T* const volatile> 
{ 
    enum { value = pointer_depth_impl<T const volatile>::value + 1 }; 
}; 

template <typename T> 
struct pointer_depth 
{ 
    enum { value = pointer_depth_impl<T const volatile>::value }; 
}; 
+0

Teşekkürler James ve son cümle de çok faydalıdır. – user2023370

+1

Bir numara, her zaman bir sonraki özyinesine "T const volatile" değerinden geçmek ve sonra sadece 'ile eşleşmektir. Bu biraz bir kesmek, ama özel const/volatile versiyonları yazmaktan kaçınmak için çalışır. –

+0

@Johannes: Güzel; 'gereksiniminden kurtulur. Bunun özellikle hack olduğunu düşünmüyorum; En azından, diğer tür özelliklerden çok daha fazla hack yok :-) –

4

Bu özyineleme yoluyla yapılabilir.

template<typename T> 
struct Depth 
{ 
    enum { value = 0 }; 
}; 

template<typename T> 
struct Depth<T*> 
{ 
    enum { value = Depth<T>::value + 1 }; 
}; 
+0

+1: Ama bunun için enum kullanmayı tercih ederim. –

+0

@Martin: Gerçekten, düzenlenmiş. –

+0

@Martin: neden enum'u tercih ettiğini açıklar mısınız? – rafak

İlgili konular