Может ли реализация стандартной библиотеки специализировать стандартные типы?

Например, предположим ради аргумента, что найдена более эффективная (хранение, операции над ним) реализация для вектора целочисленных типов (по сравнению с универсальной реализацией вектора). Может ли стандартная соответствующая библиотека сделать что-то вроде:

template <class T, class A, class Enable = void>
class vector { ... };

template <class T>
class vector<T, A, std::enable_if_t<std::is_integral<T>::value>> { ... };

Я думаю, что это было бы незаконно из-за дополнительного параметра шаблона.

Но как насчет небольшого волшебства компилятора: (помимо дополнительной работы по реализации) будет разрешено что-то вроде этого:

  • vector<integral_type, A> для внутреннего сопоставления с class vector_integral<T, A> в то время как
  • vector<anything_else, A> для внутреннего сопоставления с class vector<T, A>.

— очевидно, речь не идет о специализациях, явно упомянутых в стандарте, например std::vector<bool>

— очевидно, что специализация будет иметь такой же интерфейс и наблюдаемое поведение.

- Давайте проигнорируем concepts, так как они еще не являются стандартными. Если только у вас нет фактов.

— это чисто академический вопрос (читай личное любопытство).


person bolov    schedule 03.07.2015    source источник


Ответы (1)


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

Насколько мне известно, специализация vector<bool> включена в стандарт, поскольку ее внутреннее расположение данных отличается от общего библиотечного класса vector<T>, поэтому она должна быть специально разрешена стандартом.

В стандарте прямо указано 17.5.1.4 ad. 7:

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

person Tommy Andersen    schedule 03.07.2015