Какое пространство имен использовать для кода, который «увеличивает std»?

Иногда вы обнаруживаете, что пишете несколько битов кода заголовка, которые действительно могли бы вписаться в стандартную библиотеку C ++. Просто в качестве примера: disable_if шаблон, делая обратное std::enable_if.

Я не хочу просто поместить это в глобальное пространство имен. Но что такое конвенция? Нужно ли мне…

  • добавить его в namespace std?
  • добавить его в namespace std::experimental?
  • добавить что-то вроде namespace std::augmented?
  • добавить что-то вроде namespace myprojectname::std?
  • добавить что-то вроде namespace std-augmented?
  • что-то другое?

3

Решение

Поскольку это не определено, чтобы поместить это в пространство имен std

Я хотел бы использовать:

namespace extended_std /* or more appropriate name */
{
namespace std
{
// disable_if
}
}

И потенциально

using namespace extended_std; // So you can use std::disable_if
3

Другие решения

Все идентификаторы зарезервированы внутри std Пространство имен. Вы должны определить свой собственный. Название этого пространства имен основано на мнениях, но на вашем месте я бы определил utils:: или же stdext:: пространство имен где-то. Поскольку я никогда не сталкивался с таким случаем, я не могу сказать, каков обычный выбор.


Напомним, что список зарезервированных идентификаторов в C ++:

  • Зарезервировано в любой области, в том числе для использования в качестве макросов реализации:
    • идентификаторы, начинающиеся со знака подчеркивания, за которыми сразу следует заглавная буква
    • идентификаторы, содержащие соседние подчеркивания (или «двойное подчеркивание»)
  • Зарезервировано в глобальном пространстве имен:
    • идентификаторы, начинающиеся с подчеркивания
  • Все в пространстве имен std зарезервировано (хотя вы можете добавлять специализации шаблонов).

Из Стандарта 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,

2

По вопросам рекламы [email protected]