Como recuerdo, una vez fue preferible BOOST_MPL_ASSERT
. ¿Esto sigue siendo cierto? Alguien sabe por qué?¿Qué es mejor BOOST_MPL_ASSERT o BOOST_STATIC_ASSERT?
Respuesta
[responder a mi propia pregunta]
Depende. Esta es una comparación de manzanas a naranjas. Aunque similares, estas macros NO son intercambiables. Aquí hay un resumen de cómo funciona cada uno:
BOOST_STATIC_ASSERT(P)
genera un error de compilación si P != true
.
BOOST_MPL_ASSERT((P))
genera un error de compilación si P::type::value != true
.
Esta última forma, a pesar de que requiere paréntesis dobles, es especialmente útil debido a que puede generar mensajes de error más informativos si uno utiliza booleanas metafunciones nularia de Boost.MPL o TR1 de <type_traits>
como predicados.
Aquí es un programa de ejemplo que muestra cómo utilizar (y abuso) de estos macros:
#include <boost/static_assert.hpp>
#include <boost/mpl/assert.hpp>
#include <type_traits>
using namespace ::boost::mpl;
using namespace ::std::tr1;
struct A {};
struct Z {};
int main() {
// boolean predicates
BOOST_STATIC_ASSERT(true); // OK
BOOST_STATIC_ASSERT(false); // assert
// BOOST_MPL_ASSERT(false); // syntax error!
// BOOST_MPL_ASSERT((false)); // syntax error!
BOOST_MPL_ASSERT((bool_<true>)); // OK
BOOST_MPL_ASSERT((bool_<false>)); // assert
// metafunction predicates
BOOST_STATIC_ASSERT((is_same< A, A >::type::value));// OK
BOOST_STATIC_ASSERT((is_same< A, Z >::type::value));// assert, line 19
BOOST_MPL_ASSERT((is_same< A, A >)); // OK
BOOST_MPL_ASSERT((is_same< A, Z >)); // assert, line 21
return 0;
}
Para la comparación, aquí están los mensajes de error que mi compilador (Microsoft Visual C++ 2008) generado por las líneas 19 y 21 arriba:
1>static_assert.cpp(19) : error C2027: use of undefined type 'boost::STATIC_ASSERTION_FAILURE<x>'
1> with
1> [
1> x=false
1> ]
1>static_assert.cpp(21) : error C2664: 'boost::mpl::assertion_failed' : cannot convert parameter 1 from 'boost::mpl::failed ************std::tr1::is_same<_Ty1,_Ty2>::* ***********' to 'boost::mpl::assert<false>::type'
1> with
1> [
1> _Ty1=A,
1> _Ty2=Z
1> ]
1> No constructor could take the source type, or constructor overload resolution was ambiguous
Así que si usted está utilizando metafunciones (como se define here) como predicados continuación BOOST_MPL_ASSERT
es tanto menos detallado de código y más informativo cuando se afirma.
Para predicados booleanas simples, BOOST_STATIC_ASSERT
es menos detallado de código pesar de que sus mensajes de error pueden ser menos clara (dependiendo de su compilador.)
BOOST_MPL_ASSERT
es (aún) generalmente considerado mejor. Los mensajes de este son algo más fáciles de ver (y entiendo, si usa BOOST_MPL_ASSERT_MSG
). Hubo algunos comentarios hace unos meses sobre la desaprobación de BOOST_STATIC_ASSERT
, aunque creo que todos finalmente estuvieron de acuerdo en que todavía hay espacio para eso en el mundo.
- 1. BOOST_STATIC_ASSERT sin impulso
- 2. ¿Qué es mejor, isset o no?
- 3. ¿Qué es mejor ?: (reducir + ...) o (aplicar + ...)?
- 4. ¿Qué es mejor, ConfigObj o ConfigParser?
- 5. ¿Qué es mejor, Nagios o Sensu?
- 6. ¿Qué es mejor, o ExpectedException @test (esperado =
- 7. ¿Qué es mejor, ETL o ELT?
- 8. ¿Qué es mejor, curl o wget?
- 9. ¿Qué es mejor XPath o Linq2Xml
- 10. ¿Qué es mejor "int 0x80" o "syscall"?
- 11. ¿Qué es mejor? OpenCyc o ConceptNet?
- 12. ¿Qué es mejor usar: Convert.ToX o X.Parse (...)?
- 13. ¿Qué es mejor, PyInstaller o cx_Freeze?
- 14. ¿Qué es mejor y por qué? RaphaelJS o HTML5 Canvas?
- 15. ¿Qué caso es mejor?
- 16. ¿Qué es mejor?
- 17. jqGrid o dataTable, ¿qué mejor?
- 18. ¿Qué es mejor usar array o List <>?
- 19. ¿Qué es mejor en Python: urllib2, PycURL o mecanizar?
- 20. ¿Qué es mejor para Windows? pthreads o CreateMutex?
- 21. ¿Qué es mejor usar en CSS, porcentaje o píxeles?
- 22. ¿Qué es mejor, NSSet containsObject o fast enum?
- 23. ¿Qué os es mejor para el desarrollo: Debian o Ubuntu?
- 24. ¿Qué es "mejor": DLL COM o DLL estándar con Typelib?
- 25. ¿Qué es mejor usar varios AsyncTask o HandlerThread (Thread Pipeline)?
- 26. ¿Qué es mejor? ¿LIKE o REGEXP de mysql?
- 27. ¿Qué es mejor? Los métodos estáticos o métodos de instancia
- 28. Diseño de widgets. ¿Qué es mejor: IFrames o Javascript?
- 29. ¿Qué es mejor ... unión externa izquierda o unión externa derecha?
- 30. ¿Qué es mejor? if ... simple o múltiple simple si