Нить на SO говорит, что extending std
is UB (хорошо, если вы, конечно, не стандартные авторы). Но время от времени std
счастливо расширяется. Когда все в порядке?C++ Когда можно расширить пространство имен `std`?
ответ
Единственный случай, когда это ОК, чтобы добавить определение в std
пространства имен является специализация шаблона, который уже существует в пространстве имен и явно создать экземпляр шаблона , Однако, только если они зависят от определенного пользователем типа.
[namespace.std] (проект стандарта):
Поведение C++ программа является неопределенным, если оно добавляет декларации или определений патезрасе или к пространству имен в пространстве имен Std, если не указано иное. Программа может добавить специализацию шаблона для любого стандартного шаблона библиотеки к пространству имен std только в том случае, если объявление зависит от определенного пользователем типа, а специализация соответствует требованиям стандартной библиотеки для исходного шаблона и явно не запрещена.
Поведение C++ программы не определен, если он объявляет
(2,1) явная специализация любой функции члена стандартного шаблона класса библиотеки или
(2,2) явная специализация любого шаблон элемента-члена стандартного класса библиотеки или шаблон класса, или
(2.3) явная или частичная специализация любого шаблона класса элемента стандартного класса библиотеки или шаблона класса.
Программа может явно создавать шаблон, определенный в стандартной библиотеке, только если декларация зависит от имени определяемого пользователем типа, и экземпляр соответствует стандартным требованиям библиотеки для исходного шаблона.
В качестве примера стандартных шаблонов, которые явно предназначены для быть расширены для определенных пользователем типов: std::hash
и std::iterator_traits
.
plain copy from cppreference ... – Walter
Спасибо, я собирался спросить у @ Jarod42 список «те из« std », которые этого ожидают», но это достаточно хорошо. –
Я расширяю пространство имен 'std' с помощью функции' make_unique' для C++ 11, как написано [здесь] (http://stackoverflow.com/questions/17902405/how-to-implement-make-unique-function-in С11). Это нормально? –
Вы можете поместить специализированные шаблоны для своих пользовательских типов данных.
В качестве примера: собственные specialzations из std::hash
для std::unordered_map
related/dupe: http://stackoverflow.com/questions/320798/adding-types-to-the-std-namespace – NathanOliver
@NathanOliver связал, но не обманул. Я был бы удивлен, если бы это был совершенно новый вопрос. Но это определенно хороший. – Walter
Что вы можете сделать, это предоставить специализации для определенных шаблонов, например 'std :: numeric_limits'. –
Walter