Héritage à la compilation
Bonsoir à tous
Voici une question simple.
Soient 2 classes A et B que je ne peux modifier en rien.
Je souhaite savoir, à la compilation, s'il existe un lien d'heritage entre elles.
Merci
Héritage à la compilation
Merci pour vos reponses
Je souhaiterai préciser que si B n'hérite pas de A alors il y echec de la compilation.
J'ai retenu une idée parmi vos réponses mais ca ne marche pas voici le code et le message d'erreur.
Si vous avez une alternative du meme genre, je suis preneur.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
struct A{};
struct B:public A{};
template<bool> struct enable_if{};
template<> struct enable_if<true>{typedef int type; };
template < class U, class V>
struct is_base_of
{
static int check(U*);
static double check(...); // astuce
typedef typename enable_if<sizeof (check((V*) (NULL)) )==sizeof(int)>::type check_derivation;
};
int _tmain(int argc, _TCHAR* argv[])
{
is_base_of<A,B> type;type;
return 0;
} |
le message d'erreur précise qui ne compile pas "static int check(U*);" mais plutôt l'autre fonction.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
1>------ Build started: Project: Stl, Configuration: Debug Win32 ------
1>Compiling...
1>Stl.cpp
1>c:\tests\stl\stl\stl.cpp(28) : error C2039: 'type' : is not a member of 'enable_if<__formal>'
1> with
1> [
1> __formal=false
1> ]
1> c:\tests\stl\stl\stl.cpp(29) : see reference to class template instantiation 'is_base_of<U,V>' being compiled
1>c:\tests\stl\stl\stl.cpp(28) : error C2146: syntax error : missing ';' before identifier 'check_derivation'
1>c:\tests\stl\stl\stl.cpp(28) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\tests\stl\stl\stl.cpp(28) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>Build log was saved at "file://c:\Tests\Stl\Stl\Debug\BuildLog.htm"
1>Stl - 4 error(s), 0 warning(s) |
discussion sur les comparaisons avec sizeof
Citation:
Envoyé par
Math75
Merci pour vos reponses
Je souhaiterai préciser que si B n'hérite pas de A alors il y echec de la compilation.
J'ai retenu une idée parmi vos réponses mais ca ne marche pas voici le code et le message d'erreur.
Si vous avez une alternative du meme genre, je suis preneur.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
struct A{};
struct B:public A{};
template<bool> struct enable_if{};
template<> struct enable_if<true>{typedef int type; };
template < class U, class V>
struct is_base_of
{
static int check(U*);
static double check(...); // astuce
typedef typename enable_if<sizeof (check((V*) (NULL)) )==sizeof(int)>::type check_derivation;
};
int _tmain(int argc, _TCHAR* argv[])
{
is_base_of<A,B> type;type;
return 0;
} |
le message d'erreur précise qui ne compile pas "static int check(U*);" mais plutôt l'autre fonction.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
1>------ Build started: Project: Stl, Configuration: Debug Win32 ------
1>Compiling...
1>Stl.cpp
1>c:\tests\stl\stl\stl.cpp(28) : error C2039: 'type' : is not a member of 'enable_if<__formal>'
1> with
1> [
1> __formal=false
1> ]
1> c:\tests\stl\stl\stl.cpp(29) : see reference to class template instantiation 'is_base_of<U,V>' being compiled
1>c:\tests\stl\stl\stl.cpp(28) : error C2146: syntax error : missing ';' before identifier 'check_derivation'
1>c:\tests\stl\stl\stl.cpp(28) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\tests\stl\stl\stl.cpp(28) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>Build log was saved at "file://c:\Tests\Stl\Stl\Debug\BuildLog.htm"
1>Stl - 4 error(s), 0 warning(s) |
Tu ne peux qu'avoir une erreur de compilation, puisque enable_if<false>::type n'est pas défini - seul enable_if<true>::type l'est. C'est d'ailleurs ce que te dis le compilateur.
Donc si A et B ne sont pas liés par une relation d'héritage, check_derivation ne peut pas exister.
Un type trait qui cherche à déterminer si quelque chose est vrai ne peut pas utiliser la technique que tu mets en oeuvre. Le fait d'avoir un type qui est un alias sur int si une condition est vérifiée ne peut d'ailleurs pas beaucoup t'aider par la suite. Le but est d'avoir une structure qui te dis si telle ou telle relation est vraie - un static const bool fera l'affaire.
Edit: juste un petit point : rien dans le standard ne te garanti que sizeof(int) != sizeof(double). Les tailles de sizeof(char[1]) et sizeof(char[2]), par contre, sont garanties par le standard et sont respectivement un byte et deux bytes - ce sont donc des tailles différentes.
Heritage a la compilation
merci pour vos réponses
En fait le code que j ai envoyé, devrait fonctionner car B hérite bien de A et donc la premiere implementation de check devrait etre utilisée ce qui donne enable_if<true>, or il ne voit que la seconde meme quand j instantie is_base_of<A,A>.
J ai décidé, pour le type de retour de check, double versus int plutôt que one versus two car sinon le compliateur me renvoie une erreur C2090; le compilateur veut un pointeur en type de retour pas un tableau.
Je continue à regarder vos réponses
et merci encore pour le temps consacré.
Mathieu
Héritage à la compilation
cette implementation simplifiée de enable_if empèche la compilation c 'est bien ce que je cherchais à faire.