c++ boost boost-parameter

c++ - ¿Usando fuerte typedef como una alternativa más liviana a la biblioteca de parámetros Boost?



boost-parameter (2)

A menudo utilizo la utilidad Boef de typedef para mejorar la seguridad de mis programas. Por ejemplo escribiendo código como este:

BOOST_STRONG_TYPEDEF(int, X) BOOST_STRONG_TYPEDEF(int, Y) BOOST_STRONG_TYPEDEF(int, Width) BOOST_STRONG_TYPEDEF(int, Height) struct Rect { Rect(X x, Y y, Width w, Height h); }; // Usage: Rect rect(X(10), Y(20), Width(800), Height(600));

El fuerte typedef aquí mejora tanto la legibilidad del código como la seguridad. (El compilador informará un error si los argumentos se proporcionan en el orden incorrecto, lo que no habría sido el caso si los argumentos fueran todos int .)

Mis preguntas son:

  • ¿Está bien usar BOOST_STRONG_TYPEDEF para este propósito? (La documentación es muy breve ).
  • ¿Hay razones importantes para preferir la biblioteca de parámetros boost?

El uso de BOOST_STRONG_TYPDEF está creando un nuevo tipo, donde la biblioteca de parámetros boost es para dar nombres a los parámetros. Te permite ser más explícito con lo que toman tus funciones. Por ejemplo (de la documentación de impulso)

#include <boost/parameter/preprocessor.hpp> namespace graphs { BOOST_PARAMETER_FUNCTION( (void), // 1. parenthesized return type depth_first_search, // 2. name of the function template tag, // 3. namespace of tag types (required (graph, *) ) // 4. one required parameter, and (optional // four optional parameters, with defaults (visitor, *, boost::dfs_visitor<>()) (root_vertex, *, *vertices(graph).first) (index_map, *, get(boost::vertex_index,graph)) (in_out(color_map), *, default_color_map(num_vertices(graph), index_map) ) ) ) { // ... body of function goes here... // use graph, visitor, index_map, and color_map } }

Le permite decir explícitamente lo que se espera, casi en forma de diseño por contrato. Sin embargo, encuentro que esto complica la legibilidad de su código lo suficiente como para que no valga la pena hacerlo.

Personalmente, prefiero usar BOOST_STRONG_TYPEDEF, ya que crea nuevos tipos "que se pueden usar para hacer coincidir los parámetros de la función o la plantilla" (de nuevo, de la documentación de boost).


Tecnicamente hablando:

  • funciona
  • agrega seguridad de tipo

Hablando practicamente:

No recomendaría la creación de nuevos tipos solo por el bien de los parámetros de una sola función (a menos que sea una enumeración específica de esta función), los tipos deberían impregnar la aplicación para evitar que se utilicen los fundidos una y otra vez.

Si los tipos X , Y , Width y Height se usan en toda la aplicación, entonces no solo no habrá cast, sino que su aplicación será mucho más segura y mucho mejor documentada también (sí ... soy un tipo raro).

Ahora, con respecto a Boost.Parameters, esto es completamente diferente.

Boost.Parámetros se pueden agregar (potencialmente) cuando ya tiene tipos en su lugar. Honestamente aunque nunca vi la necesidad. Cuando sus funciones se vuelven tan difíciles de manejar que Boost.Parameters se requiere para llamarlas, debe corregir las funciones, no agregarlas al desorden.