2011-06-30 13 views
11

T türüne bağlı olarak biraz sınıra sahip sınıfım olduğunu varsayalım. T hemen hemen her şey olabilir: int, int*, pair <int, int> veya struct lol; Bununla birlikte, void, bir referans veya cv nitelikli olsa da olamaz. Bazı optimizasyon için T alt sınıfını kullanıp kullanamayacağımı bilmem gerekiyor. Bu nedenle, bazı temel özelliklerin mantıksal bir kombinasyonu olarak veya bazı SFINAE numaraları aracılığıyla belirlenen is_subclassable özellik türüne ihtiyacım var. pair <int, int> ve struct lol ise orijinal örnekte C++ şablonları: bir tür alt sınıflandırma için uygun olup olmadığını belirleme

, int ve int*, subclassable değildir.

EDIT: Aşağıda da belirtildiği gibi, sendikalar ayrıca alt sınıf ve T bir sendika türü olabilir.

İhtiyacım olan özellik türünü nasıl yazarım?

+2

Hmm. [Is_class] (http://msdn.microsoft.com/en-us/library/bb982638.aspx) yeterli olur mu? Emin değil. –

cevap

13

Bunun bir sendika dışı sınıf olup olmadığını belirlemek istersiniz. Bunu yapmamın hiçbir yolu yoktur (ve destek de bir yol bulamadı). Birlik vakaları yanlış pozitiflerle yaşayabilirseniz, bir is_class kullanabilirsiniz.

template<typename> struct void_ { typedef void type; }; 

template<typename T, typename = void> 
struct is_class { static bool const value = false; }; 

template<typename T> 
struct is_class<T, typename void_<int T::*>::type> { 
    static bool const value = true; 
}; 

Boost burada yardımcı olsa derleyici özgü yerleşiklerinden kullanan bir is_union sahiptir. is_class (hangi destek sağlar) is_union ile birlikte probleminizi çözecektir.

+0

Sendika vakasını tamamen unuttum. Ne yazık ki hayır, yanlış pozitifler kabul edilemez. Özür dileriz, çünkü sonuçta bu bir optimizasyon. – doublep

+0

@doublep sonra C++ 0x kullanmıyorsanız, taşınabilir bir şekilde çözülebilir olduğunu sanmıyorum. –

+0

Evet, sanırım C++ 0x desteğindeki optimizasyonu şart koşmak zorundayım ya da sadece bırakın. – doublep

İlgili konular