2013-04-14 3 views
6

У меня есть небольшая путаница в отношении пространств имен. Вот что я знаю. Обычно, если у вас есть пространство имен, таких, как это в кодеНазначение пространств имен в C++

namespace foo 
{ 
    namespace gfoo 
    { 
     class apple 
     {..}; 
    } 
} 

Теперь, используя следующий код

using namespace foo::gfoo; 

можно непосредственно получить доступ к классу apple без прохождения через трудности ввода имен перед классом как таковой foo::gfoo::apple.

Теперь я видел в некоторых примерах кода, как

namespace qi = boost::spirit::qi 

затем в методах его используют в качестве

void someMethod() 
{ 
    using qi::char_ 
} 

Теперь мой вопрос, какова цель сделать что-то вроде namespace qi = boost::spirit::qi

+0

[Что такое псевдоним пространства имен] (http://stackoverflow.com/questions/1211399/) – deepmax

+0

Idleeness (aka «usability» ...) – Zorawar

ответ

15

Он позволяет сглаживать одно (как правило, сложное) пространство имен по вашему выбору.

Например:

namespace fs = boost::filesystem;

... означает, что вы могли бы назвать ...

fs::exists(myFilePath);

... без того, чтобы пройти через усилие выписывая ...

boost::filesystem::exists(myFilePath);

... каждый раз.

Это главным образом для удобства.

1

Целью является создание псевдонима, который легче вводить и читать.
Существует уже вопрос об псевдонимах пространства имен here, так что это возможно дубликат.

4

с помощью директивы делает имена в используемых именах доступных *, в то время как псевдоним пространства имен создает другое имя для пространства имен, она только предоставляет другое (надеюсь, короче или проще) именем для существующего пространства имен, но вы будете необходимо по-прежнему квалифицировать или использовать директиву по использованию, чтобы сделать его доступно.

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

+0

+1, но, возможно, вы могли бы упомянуть, что ADL игнорирует использование директив? – TemplateRex

1

Каждый раз, когда вы видите имя длинной ослы (или любое выражение в целом), это возможность опечаток или даже легко пропустить намеренно отличия.Чтобы использовать довольно недавнюю терминологию, объявлением псевдонима qi является принцип DRY в действии.

Смежные вопросы