10
votes

Comment puis-je faire des assertions de temps de compilation sans C ++ 11

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é: xxx

puis on m'a demandé d'écrire une méta-valoir, qui échouera pendant la compilation si mon is_pointer fonction n'est pas Faire la bonne chose.

Quand j'ai utilisé static_assert , il m'a explicitement dit que Je ne peux utiliser que C ++ 98 standard. Comment puis-je atteindre cela?


1 commentaires

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.


3 Réponses :


5
votes

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


2 commentaires

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 myASsert;



9
votes

Il existe différentes approches, une voix commune essaie de Typedef un type non valide: xxx

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: xxx


1 commentaires

Celui-ci peut même être utilisé dans pure c :) mais notez que, avec votre macro actuelle, TypeDEF sera toujours Assert__line __ , comme cela; Pour développer __ ligne __ 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?



3
votes

J'utiliserais boost_static_assert < / a>. Vous pouvez regarder le code: boost / static_assert.hpp .

Voici une version très simplifiée, juste pour vous donner une idée: xxx

Il peut être utilisé dans de nombreux endroits (voir la documentation des exemples).

(La mise en œuvre de Boost est plus complète, avec par exemple un taille de et une structure intermédiaire, pour donner un meilleur message d'erreur et être portable sur une large gamme de compilateurs.) >


0 commentaires