Potrzebuję cechy typu, która będzie prawdziwa, jeśli dany typ pochodzi od czegokolwiek, a fałsz w przeciwnym razie.W C++ 17 można wykryć, czy struktura/klasa ma jakąkolwiek podstawę?
Na przykład:
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
}
Czy to możliwe, aby w jakiś sposób wykonania tego "is_inherit" cecha struct?
Dlaczego?
Pracuję nad ręcznym budowaniem ramek stosu dla systemu Windows x64. Zgodnie z dokumentacją https://docs.microsoft.com/en-us/cpp/build/return-values-cpp, jeśli typ:
- ma długość 1, 2, 4, 8, 16, 32 lub 64 bitów;
- nie ma zdefiniowanego przez użytkownika konstruktora, destruktora lub operatora przypisania kopii;
- nie ma prywatnych ani chronionych niestatycznych elementów danych;
- nie ma niestatycznych elementów danych typu referencyjnego;
- nie ma klas podstawowych;
- nie ma funkcji wirtualnych;
- i nie ma elementów danych, które nie spełniają również tych wymagań;
wtedy jego wartość zwracana jest w rejestrze RAX, w przeciwnym razie funkcja ma ukryty argument, który muszę wykryć i obsłużyć.
To było definicja C++ 03 POD jednak w C++ 11 zmieniło:
Ponieważ definicja uległa zmianie w standardzie C++ 11, nie zaleca przy użyciu testu
std::is_pod
.
Do tej pory, z pewnymi skoniugowanymi cechami, mogłem wykryć, czy typ spełnia definicję C++ 03 POD, czy nie. Jednak w C++ 17 zmieniły się zasady agregacji, które zepsuły moje rozwiązanie.
Jeśli uda mi się jakoś wykryć, czy typ T ma jakąkolwiek klasę podstawową, moje rozwiązanie będzie działać ponownie.
Jeśli ma podstawową * ogólnie *? Nie myśl, że możesz to zrobić bez "oszustwa". – StoryTeller
musisz poczekać na dodanie introspekcji do C++ lub znaleźć sztuczkę kompilatora. Nie sądzę, że możesz to zrobić inaczej. Ale, jak zasugerował Vittorio Romeo, może to być problem XY. Dlaczego tego potrzebujesz? Może istnieć lepszy sposób na rozwiązanie pierwotnego problemu. – bolov
Tak, ogólnie rzecz biorąc, wykryj, że dany typ ma jakąkolwiek podstawę, nie podoba mi się std :: is_base_of gdzie muszę podać 2 typy, a zwraca cecha, X dziedziczy Y. – Nyufu