Я пытаюсь подвергнуть сомнению свою правильность кода в следующем минималистском примере, в котором заголовочный файл поднимает идентификатор в текущем пространстве имен.
#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;
На первый взгляд, мы знаем, что это неправильный шаблон использования пространства имен. Но нельзя отрицать, что есть случаи, когда это может быть желательно. Насколько обоснованным, на ваш взгляд, является первый подход?