是有在C++一些簡單的方法來告訴(在編譯時)如果一個類/結構沒有任何數據成員?
E.g. struct T{};
我首先想到的是比較sizeof(T)==0
,但這似乎總是至少爲1
答案顯然是隻看看代碼,但我想這個開關打開。
是有在C++一些簡單的方法來告訴(在編譯時)如果一個類/結構沒有任何數據成員?
E.g. struct T{};
我首先想到的是比較sizeof(T)==0
,但這似乎總是至少爲1
答案顯然是隻看看代碼,但我想這個開關打開。
你可以從這個類中的另一個空派生,並檢查是否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);
};
然而,這種依靠空基類優化(但所有現代編譯做到這一點)。
如果你的編譯器支持的C++ 0x的這個方面,可以使用std::is_empty
從<type_traits>
。
它的規格是:
T
是一個類型,但不是一個聯合類型,具有比長度爲0,沒有虛成員函數,沒有虛基的位字段之外,沒有其他的非靜態數據成員類,並且沒有基類B
其中is_empty<B>::value
是false
。
我不認爲有一種標準的方法來查找一個類是否爲多態關於空。
踩着康拉德的回答,這種處理有或無虛函數的類。
template <typename T>
struct is_empty {
struct empty_ { virtual ~empty_(); };
struct helper_ : T { virtual ~helper_(); };
static bool const EMPTY = sizeof(helper_) == sizeof(empty_);
};
最簡單的答案,這兩個作品,是標準的投訴:看的類/結構和它的類層次結構的頭文件。他們會告訴你是否有數據元素(以及一個vtable)。
你會限定一個v表作爲數據成員?這是一種隱藏的方式。 – CashCow 2011-01-28 14:01:16
`sizeof(T)== 0`似乎存在於D中,但被C++標準禁止,是正確的。 – 2011-01-28 14:27:33
好奇你爲什麼想這樣做? – 2011-01-28 18:32:34