Почему код в большинстве реализаций STL настолько запутан?

STL - это критически важный элемент мира C ++, большинство реализаций основано на первоначальных усилиях Степанова и Массера.

Мой вопрос дается критичность кода, и он является одним из основных источников, где люди могут просматривать примеры хорошо написанного C ++ как для трепета, так и для учебных целей: почему на различные реализации STL так противно смотреть - запутанные и в целом хорошие примеры того, как не писать код C ++ с эстетической точки зрения.

Приведенные ниже примеры кода не прошли проверку кода в тех местах, где я работал, по причинам, различающимся от именования переменных, макета и т.д. макросы и использование операторов, которые требуют большего, чем простой взгляд, чтобы понять, что на самом деле происходит.

template 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);
   }

Обратите внимание, я не критикую интерфейс, так как он очень хорошо разработан и применим. Что меня беспокоит, так это удобочитаемость деталей реализации.

Подобные вопросы уже задавались ранее:

Существует ли читабельная реализация STL

Почему реализация STL так нечитаема? Как здесь можно было улучшить C ++?

Примечание: представленный выше код взят из алгоритма MSVC 2010 и заголовков очереди.

64
задан Community 23 May 2017 в 12:34
поделиться