Разрешить писать свои optimized specializations для стандартной библиотеки

Сергей Прейс
Сергей Прейс

Сейчас стандартные библиотеки помимо базовых шаблонных реализаций зачастую содержат оптимизированные специализации для конкретных типов данных либо используют полные инстанциации непосредственно в реализации (емнип GNU STL использует  std::uniform_distribution<double> в реализации std::normal_distribution<T>). И то и другое делает невозможным создать собственные оптимизированные специализации для классов из стандартной библиотеки.

Зачем такое может понадобиться? Ну, например, если реализации алгоритмов, используемых в вашем проекте, для parallel_unsequenced_policy вас по каким-то причинам не устраивают и вы бы хотели написать свои, при этом оставив весь код на стандартном С++ для переносимости. Или вы, как производитель платформы (железа), хотели бы предоставить свои реализации std::random для float и double с использованием встроенных в платформу возможностей. 

Сейчас работоспособность такого подхода стандартом не гарантируется и, соответственно, придется полностью клонировать <algorithm>  или <random> включая базовую реализацию. 

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

-2
рейтинг
3 комментария
yndx-antoshkka
Как я понимаю, вы хотите именно улучшить какой-то алгоритм/имплементацию, и хотите чтобы вам было удобно это делать на свой лад...

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

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

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

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

Если я "автор" платформы/архитектуры зачем мне клонировать и тащить всю стандартную С++ библиотеку? Существующие публичные библиотеки по большей части состоят из стандартного переносимого С++ кода и кажется, что прямое переиспользование этого кода - это более правильный подход к разработке, чем создание копии с небольшими отличиями.

Если в моей прикладной системе нужны/возможны оптимизации для определенных специализаций стандартных алгоритмов, я не вижу зачем пихать их в существующие реализации стандартных библиотек. Тем более, что
(1) Они вполне могут быть совместимы с любой реализации и пихать их во все реализации кажется странным
(2) Не все распространенные реализации стандартных библиотек вообще допускают добавление туда стороннего кода.

В обоих случаях кажется более правильно распространять специфические реализации отдельно и независимо от стандартных библиотек.

На самом деле почти то, что я хочу уже и так есть в стандарте, но с определенными ограничениями:
§ 17.6.4.2.1 475©ISO/IEC N4606
A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited...

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

Скажем, в библиотеке совместимой с C++17 будет некая реализация алгоритмов для parallel_unsequenced_policy. Она будет описана в наряду с последовательными реализациями и опираться на какие-то средства поддержки многопоточности (скажем std::thread). Хочется иметь возможность заменить эту реализацию на другую (скажем основанную на TBB) без необходимости тащить к себе последовательные реализации.
Сергей Прейс
yndx-antoshkka
Это уже можно делать, если вы разработчик стандартной библиотеки: [Note: This provision reserves the privilege of creating non-standard execution policies to the library implementation. — end note]

Если вам хочется более продвинутые способы выполнения - добавляйте их сразу в стандартную библиотеку. Если они очень хороши - можем помочь с добавлением их в стандарт.
yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).