El STL es una pieza fundamental del mundo de C++, la mayoría de las implementaciones derivan de los esfuerzos iniciales de Stepanov y Musser.¿Por qué el código en la mayoría de las implementaciones de STL es tan intrincado?
Mi pregunta es dada la criticidad del código, y es una de las fuentes principales para que las personas vean ejemplos de C++ bien escrito para asombro y propósitos de aprendizaje: ¿Por qué son tan desagradables las diversas implementaciones de la STL? a - ejemplos enrevesados y generalmente buenos de cómo no escribir código C++ desde un punto de vista estético.
Los siguientes ejemplos de código no pasarán la revisión de código en los lugares en los que he trabajado por razones que varían desde nomenclatura variable, diseño, macros y usos de operadores que requieren más que un simple vistazo para descubrir qué está ocurriendo realmente .
template<class _BidIt> inline
bool _Next_permutation(_BidIt _First, _BidIt _Last)
{ // permute and test for pure ascending, using operator<
_BidIt _Next = _Last;
if (_First == _Last || _First == --_Next)
return (false);
for (; ;)
{ // find rightmost element smaller than successor
_BidIt _Next1 = _Next;
if (_DEBUG_LT(*--_Next, *_Next1))
{ // swap with rightmost element that's smaller, flip suffix
_BidIt _Mid = _Last;
for (; !_DEBUG_LT(*_Next, *--_Mid);)
;
_STD iter_swap(_Next, _Mid);
_STD reverse(_Next1, _Last);
return (true);
}
if (_Next == _First)
{ // pure descending, flip all
_STD reverse(_First, _Last);
return (false);
}
}
}
_Ty operator()()
{ // return next value
static _Ty _Zero = 0; // to quiet diagnostics
_Ty _Divisor = (_Ty)_Mx;
_Prev = _Mx ? ((_Ity)_Ax * _Prev + (_Ty)_Cx) % _Divisor
: ((_Ity)_Ax * _Prev + (_Ty)_Cx);
if (_Prev < _Zero)
_Prev += (_Ty)_Mx;
return (_Prev);
}
Tenga en cuenta que no estoy criticando la interfaz, ya que está muy bien diseñada y es aplicable. Lo que me preocupa es la legibilidad de los detalles de implementación.
A preguntas similares se han planteado anteriormente:
Is there a readable implementation of the STL
Why STL implementation is so unreadable? How C++ could have been improved here?
Nota: El código presentado anteriormente se toma de MSVC 2010 algoritmo de cola o cabeceras.
Según lo leí, la pregunta no es realmente "¿Por qué el STL es tan intrincado?" pero está más en la línea de "¿Por qué las implementaciones comúnmente usadas de la STL tienen un código fuente aparentemente complicado?" ¿Es eso correcto? –
@James: Eso es correcto. Además califiqué mi pregunta con una declaración en la parte inferior. –
STL no es exactamente un modelo de objeto que fue ampliamente adoptado en otros idiomas. Pero ese no es el punto de su queja. Este es el tipo de basura que los diseñadores de la biblioteca tienen que pasar cuando el idioma tiene un preprocesador. Ah, y tener que escribir toda la implementación en un encabezado. –