Por que usar boost :: ice_or em vez de ||e boost :: ice_and em vez de && em enable_if?
-
28-10-2019 - |
Pergunta
Como a pergunta afirma, há uma razão pela qual as pessoas usam a versão de struct sobre as condicionais normais?
Solução
Um trecho das Boost Coding Guidelines for Integral Constant Expressions :
Não use operadores lógicos em expressões constantes integrais; em vez disso, use a meta-programação de modelo.
O cabeçalho contém vários modelos de solução alternativa, que cumprem a função de operadores lógicos, por exemplo, em vez de:
INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2
Use:
::boost::type_traits::ice_or<INTEGRAL_CONSTANT1,INTEGRAL_CONSTANT2>::value
Justificativa: vários compiladores (particularmente os compiladores Borland e Microsoft) tendem a não reconhecer expressões constantes integrais envolvendo operadores lógicos como expressões constantes integrais genuínas. O problema geralmente só aparece quando a expressão constante integral está aninhada no código do modelo e é difícil de reproduzir e diagnosticar.
Então, eu diria nunca em um compilador compatível. (Mas se você precisar oferecer suporte a compiladores não compatíveis, use-o.)