Dans un entretien d'embauche, on m'a demandé d'écrire une métafunction
Cela a déterminé si un type était un pointeur. C'est
ce que j'ai présenté: puis on m'a demandé d'écrire une méta-valoir, qui échouera
pendant la compilation si mon Quand j'ai utilisé is_pointer code> fonction n'est pas
Faire la bonne chose. p> static_assert code>, il m'a explicitement dit que
Je ne peux utiliser que C ++ 98 standard. Comment puis-je atteindre cela? P> p>
3 Réponses :
Dans votre cas
assert<!is_pointer<char>::value>(); // valid
assert<is_pointer<char *>::value>(); // valid
assert<is_pointer<char>::value>(); // compilation error:
// use of incomplete class
Ce n'est pas ce que Sfinae est (la solution est correcte, mais le nom est mal utilisé).
Ceci est également limité aux emplacements où vous pouvez créer un objet du type. Pour pouvoir l'utiliser dans d'autres contextes, vous devrez créer de faux objets: //pace de noms: affirmer
Il existe différentes approches, une voix commune essaie de Typedef un type non valide: Ceci peut être utilisé dans la plupart du temps tout contexte et trébuchera le compilateur si la condition est fausse, car elle Essayerait de taper un type non valide (réseau de nombre négatif d'éléments). Il peut être utilisé dans différents contextes: p>
Celui-ci peut même être utilisé dans pure c :) mais notez que, avec votre macro actuelle, TypeDEF sera toujours Assert__line __ code>, comme cela; Pour développer __ ligne __ code> au numéro de ligne réel, vous avez besoin d'un "join" intermédiaire "macro appel: Que faut-il faire avec des macros qui doivent coller deux jetons ensemble?
J'utiliserais Voici une version très simplifiée, juste pour vous donner une idée: p> Il peut être utilisé dans de nombreux endroits (voir la documentation des exemples). P> (La mise en œuvre de Boost est plus complète, avec par exemple un boost_static_assert code> < / a>. Vous pouvez regarder le code: boost / static_assert.hpp . taille de code> et une structure intermédiaire, pour donner un meilleur message d'erreur et être portable sur une large gamme de compilateurs.) P> P> >
Je pense qu'à ce stade, vous avez passé le "chèque de vue si vous connaissez réellement la langue" de l'entretien, à moins que la société ne fabrique des compilateurs C ++ ou quelque chose.