__cplusplus
devrait être défini comme 199711L
en pré-C++11 compilateurs, 201103L
dans ceux soutien de la collectivité C++11. Si c'est une grande aide dans la pratique c'est une autre question: la plupart des compilateurs sont seulement à mi-chemin, et donc ne devrait pas être le définissant comme 201103L
, même s'ils prennent en charge les fonctionnalités qui vous intéressent. Et il n'est pas rare qu'un compilateur à mentir: un compilateur qui la définit en tant que 199711L
et ne prend pas en charge export
pour les modèles, par exemple. Mais il n'y a pas de norme fonction par fonction test.
La solution la plus simple est juste de ne pas utiliser toute nouvelle fonctionnalité jusqu'à ce que vous pouvez être sûr que tous les compilateurs en charge. Vous avez à écrire et à soutenir le secours de code de toute façon, pourquoi conserver les deux versions. La seule exception à cette règle peut être de nouvelles fonctionnalités qui ont un impact sur les performances: si le compilateur prend en charge la sémantique de déplacement ou non. Dans de tels cas, je vous suggère un compilateur dépendant d'inclure le fichier, ce qui vous écrivez vous-même basé sur la documentation du compilateur et des personnels des tests; tout simplement parce que le compilateur peut noter qu'il prend en charge une fonctionnalité spécifique ne signifie pas que son soutien est exempt de bogues. Il suffit de créer un répertoire par ciblée compilateur, mettre ce fichier là et préciser le -I
ou /I
option dans votre makefile ou un fichier de projet.
Et vos tests devrait être quelque chose le long des lignes de:
#ifdef HAS_MOVE_SEMANTICS
...
#endif
plutôt que simplement sur le compilateur, version ou quoi que ce soit.