Como dice la pregunta, ¿hay alguna razón por la que las personas usan la versión de estructura sobre las condicionales normales?¿Por qué usar boost :: ice_or en lugar de || y boost :: ice_and en lugar de && en enable_if?
Respuesta
Un extracto del Boost Coding Guidelines for Integral Constant Expressions:
No utilice los operadores lógicos en expresiones constantes integrales; use meta-programación de plantillas en su lugar.
La cabecera contiene una serie de plantillas de solución, que cumplen la función de los operadores lógicos, por ejemplo, en lugar de:
INTEGRAL_CONSTANT1 || INTEGRAL_CONSTANT2
Uso:
::boost::type_traits::ice_or<INTEGRAL_CONSTANT1,INTEGRAL_CONSTANT2>::value
Justificación: Varios compiladores (en particular, los compiladores de Borland y Microsoft) tienden a no reconocer las expresiones constantes integrales que implican operadores lógicos como expresiones constantes integrales genuinas. Por lo general, el problema solo aparece cuando la expresión constante integral está anidada en el interior del código de la plantilla, y es difícil de reproducir y diagnosticar.
Así que yo diría que nunca en un compilador compatible. (Pero si necesita admitir compiladores no conformes, úselo.)
- 1. usando señales boost en lugar de qt
- 2. ¿Puedo usar boost :: enable_if en una función miembro?
- 3. boost :: enable_if no en la firma de función
- 4. ¿De qué sirve usar boost :: mem_fn si tenemos boost :: bind?
- 5. ¿Por qué debería usar Apache C++ Standard Library en lugar de cualquier otra implementación de STL junto con Boost?
- 6. ¿Por qué usar {} en lugar de nuevo Object() y usar [] en lugar de new Array() y verdadero/falso en lugar de new Boolean()?
- 7. por qué usar - en lugar de _ en la url
- 8. Boost Asio en Linux sin usar Epoll
- 9. ¿Qué puedo usar en lugar de eval()?
- 10. ¿Qué debo usar en lugar de sscanf?
- 11. ¿Por qué debería usar git en lugar de svn?
- 12. ¿Por qué usar registerDefaults: en lugar de setValue: forKey :?
- 13. ¿Por qué usar Apio en lugar de RabbitMQ?
- 14. ¿Por qué usar select() en lugar de sleep()?
- 15. ¿Por qué usar Enums en lugar de Constants?
- 16. ¿Por qué usar GWT.create() en lugar de nuevo?
- 17. ¿Por qué usar tuplas en lugar de objetos?
- 18. ¿Por qué debería usar url.openStream en lugar de url.getContent?
- 19. ¿por qué debería usar content_tag en lugar de html "normal"?
- 20. nodejs: ¿qué usar en lugar de require.paths?
- 21. ¿Qué podemos usar en lugar de nstimer?
- 22. ¿Por qué usar System.Threading.Interlocked.Decrement en lugar de menos?
- 23. ¿Por qué usar AsQueryable() en lugar de List()?
- 24. ¿Por qué usar argparse en lugar de optparse?
- 25. ¿Por qué usar ROLAP en lugar de simplemente MySQL?
- 26. ¿Por qué darcs en lugar de git?
- 27. ¿Por qué no es aconsejable usar attach() en R, y qué debería usar en su lugar?
- 28. Por qué/cuándo usar (!! p) en lugar de (p! = NULO)
- 29. ¿Por qué debería usar operator.itemgetter (x) en lugar de [x]?
- 30. ¿Por qué debería usar var en lugar de un tipo?
"en particular los compiladores de ** ** ** y de Borland" ¡Oh ...! VS210 aquí. : | Gracias por proporcionar ese fragmento! – Xeo
@Xeo: No hay problema. Es una pena que no enumeren los compiladores, pero realmente dudo que VC2010 lo necesite. – GManNickG
@Xeo - Definitivamente significan VC6, que es notorio tanto por ser demasiado utilizado como por ser muy pre-estándar. VS2010 no tiene tales problemas. –