Иногда вы обнаруживаете, что пишете несколько битов кода заголовка, которые действительно могли бы вписаться в стандартную библиотеку C ++. Просто в качестве примера: disable_if
шаблон, делая обратное std::enable_if
.
Я не хочу просто поместить это в глобальное пространство имен. Но что такое конвенция? Нужно ли мне…
namespace std
?namespace std::experimental
?namespace std::augmented
?namespace myprojectname::std
?namespace std-augmented
?Поскольку это не определено, чтобы поместить это в пространство имен std
Я хотел бы использовать:
namespace extended_std /* or more appropriate name */
{
namespace std
{
// disable_if
}
}
И потенциально
using namespace extended_std; // So you can use std::disable_if
Все идентификаторы зарезервированы внутри std
Пространство имен. Вы должны определить свой собственный. Название этого пространства имен основано на мнениях, но на вашем месте я бы определил utils::
или же stdext::
пространство имен где-то. Поскольку я никогда не сталкивался с таким случаем, я не могу сказать, каков обычный выбор.
Напомним, что список зарезервированных идентификаторов в C ++:
Из Стандарта C ++ 2003 года:
17.4.3.2.1 Глобальные имена [lib.global.names]
Определенные наборы имен и сигнатур функций всегда зарезервированы для реализации:
- Каждое имя, которое содержит двойное подчеркивание (_ _) или начинается с подчеркивания, за которым следует заглавная буква (2.11), зарезервировано для реализации для любого использования.
- Каждое имя, которое начинается со знака подчеркивания, зарезервировано для реализации для использования в качестве имени в глобальном пространстве имен.165
165) Такие имена также зарезервированы в пространстве имен :: std (17.4.3.1).
7.1.3 Зарезервированные идентификаторы
Каждый заголовок объявляет или определяет все идентификаторы, перечисленные в соответствующем подпункте, и
опционально объявляет или определяет идентификаторы, перечисленные в соответствующем подразделе будущих направлений библиотеки, и идентификаторы, которые всегда зарезервированы либо для любого использования, либо для использования в качестве идентификаторов области файла.
- Все идентификаторы, которые начинаются со знака подчеркивания и заглавной буквы или другого
Подчеркивание всегда зарезервировано для любого использования.- Все идентификаторы, которые начинаются с подчеркивания, всегда зарезервированы для использования в качестве идентификаторов.
с областью файла как в обычном пространстве, так и в пространстве имен тега.- Каждое имя макроса в любом из следующих подпунктов (включая будущую библиотеку
направления) зарезервировано для использования, как указано, если включен какой-либо из связанных с ним заголовков;
если прямо не указано иное (см. 7.1.4).- Все идентификаторы с внешней связью в любом из следующих подпунктов (включая
будущие направления библиотеки) всегда зарезервированы для использования в качестве идентификаторов с внешними
связь.154- Каждый идентификатор с областью файла указан в любом из следующих подпунктов (включая
будущие направления библиотеки) зарезервировано для использования в качестве имени макроса и в качестве идентификатора с
область файла в том же пространстве имен, если включен какой-либо из связанных с ним заголовков.Другие идентификаторы не зарезервированы. Если программа объявляет или определяет идентификатор в
контекст, в котором он зарезервирован (кроме как разрешено в 7.1.4), или определяет зарезервированный
идентификатор как имя макроса, поведение не определено.Если программа удаляет (с
#undef
) любое макроопределение идентификатора в первом
группа, указанная выше, поведение не определено.154) Список зарезервированных идентификаторов с внешней связью включает
errno
,math_errhandling
,setjmp
, а такжеva_end
,