2011-01-28 64 views
15

喂,有沒有簡單的方法來判斷一個類/結構是否沒有數據成員?

是有在C++一些簡單的方法來告訴(在編譯時)如果一個類/結構沒有任何數據成員?

E.g. struct T{};

我首先想到的是比較sizeof(T)==0,但這似乎總是至少爲1

答案顯然是隻看看代碼,但我想這個開關打開。

+4

你會限定一個v表作爲數據成員?這是一種隱藏的方式。 – CashCow 2011-01-28 14:01:16

+0

`sizeof(T)== 0`似乎存在於D中,但被C++標準禁止,是正確的。 – 2011-01-28 14:27:33

+0

好奇你爲什麼想這樣做? – 2011-01-28 18:32:34

回答

13

你可以從這個類中的另一個空派生,並檢查是否sizeof(OtherClass) == 1。 Boost在is_empty類型特徵中這樣做。

未經測試:

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

然而,這種依靠空基類優化(但所有現代編譯做到這一點)。

11

如果你的編譯器支持的C++ 0x的這個方面,可以使用std::is_empty<type_traits>

它的規格是:

T是一個類型,但不是一個聯合類型,具有比長度爲0,沒有虛成員函數,沒有虛基的位字段之外,沒有其他的非靜態數據成員類,並且沒有基類B其中is_empty<B>::valuefalse

我不認爲有一種標準的方法來查找一個類是否爲多態關於空。

1

踩着康拉德的回答,這種處理有或無虛函數的類。

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

最簡單的答案,這兩個作品,是標準的投訴:看的類/結構和它的類層次結構的頭文件。他們會告訴你是否有數據元素(以及一個vtable)。

相關問題