Pourquoi utiliser boost :: ice_or au lieu de || et boost :: ice_and au lieu de && dans activy_if?
-
28-10-2019 - |
Question
Comme l'indique la question, y a-t-il une raison pour laquelle les gens utilisent la version struct sur les conditions normales?
La solution
Un extrait du Boost des directives de codage pour les expressions constantes intégrales:
N'utilisez pas les opérateurs logiques dans des expressions constantes intégrales; Utilisez plutôt la méta-programmation du modèle.
L'en-tête contient un certain nombre de modèles de solution de contournement, qui remplissent le rôle des opérateurs logiques, par exemple au lieu de:
INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2
Utilisation:
::boost::type_traits::ice_or<INTEGRAL_CONSTANT1,INTEGRAL_CONSTANT2>::value
Justification: Un certain nombre de compilateurs (en particulier les compilateurs Borland et Microsoft) ont tendance à ne pas reconnaître les expressions constantes intégrales impliquant des opérateurs logiques comme de véritables expressions constantes intégrales. Le problème n'apparaît généralement que lorsque l'expression constante intégrale est imbriquée profondément à l'intérieur du code du modèle et est difficile à reproduire et à diagnostiquer.
Je dirais donc jamais sur un compilateur conforme. (Mais si vous devez prendre en charge les compilateurs non conformes, utilisez-le.)