8

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

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, так как они еще не являются стандартом. Если у вас нет некоторых фактов.

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

ответ

1

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

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

Стенд явно говорит 17.5.1.4 объявление. 7:

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

Смежные вопросы