J'ai besoin d'un type de trait qui sera vrai si le type de dérive à partir de rien, et false sinon.
Par exemple:
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
}
Est-il possible de faire en quelque sorte mettre en œuvre que "is_inherit" trait struct?
Pourquoi?
Je suis en train d'élaborer un manuel de pile d'image builder pour Windows x64. Selon l' https://docs.microsoft.com/en-us/cpp/build/return-values-cpp de la documentation, si un type:
- a une longueur de 1, 2, 4, 8, 16, 32, ou 64 bits;
- n'a pas défini par l'utilisateur constructeur, destructeur, ou copie de l'opérateur d'assignation;
- n'a pas privées ou protégées non-membres de données statiques;
- n'a pas non données membres statiques de type de référence;
- n'a pas de classes de base;
- n'a pas de fonctions virtuelles;
- et n'a pas de membres de données qui ne sont pas aussi satisfaire à ces exigences;
alors sa valeur de retour est dans le registre RAX, sinon la fonction a un caché argument que je doit détecter et traiter.
C'est la définition d'un C++03 POD, cependant, en C++11, ce qui a changé:
Parce que la définition a changé dans le C++11 standard, nous ne recommandons pas l'utilisation d'
std::is_pod
pour ce test.
Jusqu'à maintenant, avec quelques conjugué traits je pouvais détecter si le type répond à la définition d'un C++03 POD ou pas. Toutefois, avec le C++17 le total des règles ont changé, et qui a brisé ma solution.
Si je peux en quelque sorte détecter si un type T a toute la classe de base, ma solution ne fonctionne de nouveau.