сокращение пространства имен до базы - PullRequest
1 голос
/ 07 мая 2020

Есть ли способ «сжать пространство имен»?

например, от

std::chrono::milliseconds до std::milliseconds только по пространству имен?

т.е.

namespace std = std::chrono

(пожалуйста, не обращайте внимания на то, что это модифицирует std. Это просто пример, я думаю, что все могут понять)

Ответы [ 3 ]

1 голос
/ 07 мая 2020

Добавьте свой собственный псевдоним к std::chrono, внешний к std:

namespace chrono = std::chrono;

И затем используйте chrono::milliseconds.

Можно свернуть слои пространств имен, добавив псевдоним внутреннего пространства имен. Стандартная библиотека делает это:

namespace std {
    namespace ranges::views { /* views stuff */ }

    namespace views = ranges::views;
}

Так что std::ranges::views::filter также может быть доступен как std::views::filter.

Но здесь это не помогает, потому что milliseconds - это тип, не пространство имен. Единственный способ свернуть содержимое пространства имен - использовать директиву using (или, что то же самое, целое множество объявлений using):

namespace std {
    namespace chrono { /* chrono things */ }

    using namespace chrono;
}

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

Таким образом, эквивалентом псевдонима внутреннего пространства имен будет просто псевдоним внешнего пространства имен:

namespace std {
    namespace chrono { /* chrono things */ }
}
namespace chrono = std::chrono;

И теперь вы пишете chrono::milliseconds вместо std::chrono::milliseconds, не нарушая ничего в любом из этих пространств имен.

В качестве альтернативы, если вы действительно хотите просто засунуть все в одно и то же пространство имен, сделайте это в другое:

namespace all {
    using namespace std;
    using namespace std::chrono;
}

Хотя, как я уже сказал, сомнительно.

0 голосов
/ 07 мая 2020

Если у вас есть пространство имен с каким-то глубоко вложенным именем, которое вы хотите сократить (и это пространство имен, которое вам разрешено изменять). например:

namespace my {
  namespace deeply {
    namespace nested {
      namespace ns {
 // ...
}}}}

вы можете упростить его с помощью псевдонима пространства имен:

namespace my {
  namespace easy = deeply::nested::ns;
}
0 голосов
/ 07 мая 2020

Есть ли способ «сжать пространство имен»?

Вы можете присвоить пространству имен псевдоним или иметь using namespace объявления.

например,

std :: chrono :: миллисекунды в std :: миллисекунды

Что-то подобное возможно, но не для пространства имен std, потому что вы не можете помещать такие объявления есть.

Но это возможно например:

namespace my {
     using namespace std::chrono;
}

и это:

namespace my_chrono = std::chrono;
...