2011-01-28 30 views
15

Hallo,Bir sınıf/yapının veri üyesi olup olmadığını anlamanın kolay bir yolu var mı?

C++ 'da, bir sınıf/struct'in veri üyesine sahip olmaması durumunda (derleme zamanında) söylemek için kolay bir yol var mı?

E.g. struct T{};

ilk düşüncem sizeof(T)==0 karşılaştırmaktır, ancak bu her zaman en az 1.

açık cevap sadece kodlarına bakmak olurdu gibi görünüyor, ama bu konuda geçmek istiyorum.

+4

Bir v-tabloyu veri üyesi olarak nitelendirir misiniz? Bu bir çeşit gizli olan. – CashCow

+0

'sizeof (T) == 0' D'de var gibi görünüyor, ancak C++ standardı tarafından yasaklanmış, doğru. –

+0

Bunu yapmak için neden merak ediyorsunuz? –

cevap

13

Bu sınıftan başka bir boşta türetebilir ve sizeof(OtherClass) == 1 olup olmadığını kontrol edebilirsiniz. Boost bunu is_empty tipinde bir özelliğiyle yapar. Test edilmemiş

:

template <typename T> 
struct is_empty { 
    struct helper_ : T { int x; }; 
    static bool const VALUE = sizeof(helper_) == sizeof(int); 
}; 

Ancak bu boş taban sınıfı optimizasyonu dayanır (ancak tüm modern derleyiciler bunu).

+2

Çalışmayacak. CashCow'un söylediği gibi bu, sanal işlevli sınıflar için çalışmayacaktır. – UmmaGumma

+3

@Ashot: Bu "işe yaramayacak" olmamalı, "boş tanımları verildiğinde işe yaramayacaktır". – GManNickG

+0

@Ashot Martirosyan ... Ama çözüm, test edilen sınıftan olduğu gibi kukla sanal işlevli bazı temel yardımcı sınıftan türetilerek değiştirilebiliyor – user396672

11

Derleyiciniz, C++ 0x'nin bu yönünü destekliyorsa, 'dan std::is_empty'u kullanabilirsiniz.

O var özelliğidir:

T uzunluğu 0, hiçbir sanal üye fonksiyonları, hiçbir sanal taban bit-alanları dışında hiçbir statik olmayan veri üyeleri ile bir sınıf tipi, ancak bir birlik türüdür sınıfları ve is_empty<B>::value'un false olduğu B taban sınıfı yoktur.

Bir sınıfın polimorfizm açısından boş olup olmadığını bulmak için standart bir yol olduğunu düşünmüyorum.

+0

Konrad Rudolph'un cevabını daha önce nasıl yorumladım, polimorfik olduğunda sınıfın boş olup olmadığını kontrol etmek mümkündür. 'Is_polymorphic () && sizeof (T) == sizeof (some_polymorphic_class) 'seçeneğini kontrol etmeniz gerekir. Bu çoğu derleyicilerde polimorfik sınıflar için çalışacaktır. Sadece çoklu mirasa sahip sınıflar için çalışmayacaktır. – UmmaGumma

+4

@Ashot: "Çoğu derleyicide" Genellikle derleyiciler açısından düşünmemeye çalışıyorum. :) – GManNickG

1

Konrad'ın cevabına basmak, bu, sanal işlevlerle veya sanal işlevler olmadan sınıfları işler.

template <typename T> 
struct is_empty { 
    struct empty_ { virtual ~empty_(); }; 
    struct helper_ : T { virtual ~helper_(); }; 
    static bool const EMPTY = sizeof(helper_) == sizeof(empty_); 
}; 
+1

Tamam, ama sanal tablonun işaretçisi gerekli değildir. (Void *) (örneğin, 16 bit Borland C++ için bellek modeline bakılmaksızın bu amaçla 2 bayt "kısa" işaretçisi kullanan yanlış görünüyor). Sizeof (SomeEmptyPolimorphicClass) – user396672

+0

@user ile karşılaştırmak daha iyidir: iyi fikir. –

0

çalışır ve standart şikayet hem bu en basit cevap: struct sınıfın/ve sınıfsal hiyerarşi için başlık dosyaları bak. Veri öğeleri (yanı sıra vtable) olup olmadığını size söyleyecektir.

İlgili konular