Корректность пространства имен - PullRequest
7 голосов
/ 02 августа 2009

Я пытаюсь подвергнуть сомнению свою правильность кода в следующем минималистском примере, в котором заголовочный файл поднимает идентификатор в текущем пространстве имен.

#include <string>

namespace mine {

    using std::string; // std::string lifted into mine

    struct agent
    {
        string name;
    };
}

Это предложение, которое я недавно сделал в качестве другой альтернативы использованию typedef:

#include <string>

struct agent
{
    private:
        typedef std::string string;
    public:
        string name;
};

Я посчитал первый вариант более правильным, поскольку он использует мое собственное пространство имен, и к этой практике следует привыкнуть (к созданию и управлению пространством имен). Между тем, поскольку идентификатор поднимается внутри пространства имен, которым я управляю, это делает этот подход безопасным.

Однако, у меня есть вторые мысли. С одной стороны, небрежное использование пространства имен mine , например с директивой using, также приведет к появлению std :: string. Другая проблема в том, что я слишком много выставляю std :: string. Возможно, даже в области пространства имен mine , где это не нужно или нежелательно.

Мне кажется, правильнее всегда работать в минимально возможном объеме и работать оттуда. Выставляйте только абсолютно необходимое. Тот факт, что я сделал typedef private во втором примере, был именно из-за этого. Но тогда я не последую своему собственному совету со вторым примером.

Но, с другой стороны, мои опасения связаны с тем, что кто-то может неправильно использовать пространство имен mine :

using namespace mine;

На первый взгляд, мы знаем, что это неправильный шаблон использования пространства имен. Но нельзя отрицать, что есть случаи, когда это может быть желательно. Насколько обоснованным, на ваш взгляд, является первый подход?

Ответы [ 3 ]

8 голосов
/ 02 августа 2009

Я бы подумал, что очевидное решение:

namespace mine { 
    struct agent
    {
        std::string name;
    };
}

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

7 голосов
/ 02 августа 2009

Я обычно делаю это:

// In header file:

#include <string>

namespace mine {

    struct agent
    {
        std::string name;
    };
}

// In source file:

using std::string; 

namespace mine {
   // Code
}     

Таким образом, вам не нужно писать std :: снова и снова в реализации, но вы избегаете проблемы людей, которые используют ваши заголовки, непреднамеренно импортируя символы std ::.

1 голос
/ 17 апреля 2012

Я обычно делаю это:

// In header file
#include <string>
namespace mine 
{
    namespace detail 
    {
        using std::string;

        struct agent
        {
            string name;
        }
    }

    using detail::agent;
}

Таким образом, мне не нужно постоянно вводить std:: в заголовке, но кто-то все еще может сделать using namespace mine; и не импортировать имена из std.

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