我需要一個類型特徵,如果給定的類型來自任何東西,那麼這個類型特徵將爲true,否則爲false。使用C++ 17可以檢測結構/類是否有任何基數?
例如:
template<class T>
struct is_inherit
//... logic of inheritance detection
;
template<class T>
void AppLogic(){
if constexpr(is_inherit<T>::value) {
puts("T has base");
//...
} else {
puts("T doesn't have base");
//...
}
}
struct A {};
struct C {};
struct B: C {};
int main() {
AppLogic<A>(); // print: T doesn't have base
AppLogic<B>(); // print: T has base
}
是否有可能以某種方式實現一個 「is_inherit」 特質結構?
爲什麼?
我正在爲Windows x64開發一個手動堆棧框架生成器。根據https://docs.microsoft.com/en-us/cpp/build/return-values-cpp文檔,如果類型:
- 的長度爲1,2,4,8,16,32或64位;
- 沒有用戶定義的構造函數,析構函數或複製賦值運算符;
- 沒有私人或受保護的非靜態數據成員;
- 沒有引用類型的非靜態數據成員;
- 沒有基類;
- 沒有虛擬功能;
- 並且沒有數據成員也不符合這些要求;
那麼它的返回值是在RAX寄存器中,否則函數 有一個隱藏的參數,我必須檢測和處理。
過去,這是一個C++ 03 POD的定義,但在C++ 11這個改變:
因爲定義在C++ 11的標準已經改變,我們不建議使用
std::is_pod
進行此測試。
到目前爲止,有些共軛性狀可以檢測出類型是否符合C++ 03 POD的定義。然而,在C++ 17中,聚合規則已經發生了變化,這打破了我的解決方案。
如果我能以某種方式檢測類型T是否有任何基類,我的解決方案將再次工作。
如果它的基數*一般*?不要以爲你沒有「作弊」就可以做到這一點。 – StoryTeller
您需要等待將自省添加到C++中,或查找編譯器特定的技巧。否則我認爲你不能這樣做。但正如維托裏奧羅密歐所說,這可能是一個XY問題。你爲什麼需要這個?可能有更好的方法來解決你原來的問題。 – bolov
是的,一般來說,檢測給定的類型有任何基地,不喜歡std :: is_base_of在那裏我必須給2種類型和特質返回是X繼承Y. – Nyufu