Возвращение пространства имен - PullRequest
3 голосов
/ 16 декабря 2011

Существует ли способ возврата пространства имен в C ++ без использования формы ::fully::qualified::namespace::name?

Дано:

namespace f {
    void p() { }
    namespace g {
        void p() {
           [..]::p();
        }
    }
}

Существует ли правильная форма [..], кроме ее полной квалификации (т.е. ::f::p())? Цель состоит в том, чтобы не использовать p (), поскольку бесконечная рекурсия здесь не является целью, а также не использовать FQ для экономии места.

1 Ответ

3 голосов
/ 16 декабря 2011

Поиск имени работает из внутренней области видимости наружу, поэтому вам не нужно каждый раз идти сверху вниз.Если вы пропустите ведущий ::, то вы получите поиск, который возвращается, пока он не найдет искомое имя, поэтому f::p эффективно возвращается, пока не найдет f, а затем не найдет p внутри этого f.Вам не нужен полный ::f::p(), хотя в вашем случае, поскольку f находится в глобальном пространстве имен, нет большой разницы в наборе.

Рассмотрим этот пример, где экономия для вызова ::f::g::f::p() более очевиден.

namespace f {
    void p();
    namespace g {
        void p();
        namespace f {
            void p();
            namespace h {
                void p()
                {
                    f::p();   // same as ::f::g::f::p()
                    ::f::p(); // fully qualified
                    g::p();   // same as ::f::g::p();
                    p();      // recurse!
                }
            }
        }
    }
}

Не существует явного способа принудительного поиска, чтобы исключить непосредственный уровень области действия (блок или пространство имен, нет ..::p() или ^::p() или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...