2016-06-18 2 views
0

Хотя я искал, я не знаю, возможно ли это вообще.Запретить третьему лицу использовать мое полное пространство имен

Как я могу запретить пользователю библиотеки писать using namespace myns; в любом месте в его/ее коде?

Допустим, я реализовал библиотеку, охватывающую все его элементы в пространстве имен myns:

namespace myns 
{ 
    class MyClass 
    { 

    }; 

    class string 
    { 

    }; 
} 

Эта библиотека будет использоваться другим программистом. Как я могу заставить его/ее использовать

// somewhere in code 
myns::MyClass myClass; 
myns::string myString; 
std::string stdString; 

вместо

using namespace myns; 

// somewhere in code 
MyClass myClass; 
string myString; // this would most likely be a mess 
string stdString; 

это поможет с наездом пространства имен.

+0

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

+0

Я написал 'string' для примера. Дело в том, что я хочу, чтобы он не использовал «пространство имен». –

ответ

3

Вы не можете. В стандарте говорится, что можно написать using namespace myns;, чтобы получить все имена, и вы ничего не можете с этим поделать.

Если пользователь получил столкновение после using namespace XXX;, это его собственная ошибка. Как правило, невозможно остановить людей от стрельбы в ногу, если они попытаются.

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

+0

Ну, да, вот в чем дело. Чтобы обеспечить соблюдение правила, которое будет препятствовать ленивому программисту тратить время на поиск более поздних символов в пространстве имен. –

+1

@AlexandruIrimiea Как я уже сказал, вы не можете этого сделать. –

1

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

struct myns final 
{ 
    class MyClass 
    { 

    } 

    class string 
    { 

    } 

private: 
    // private constructor, copy constructor and assignment operator 
    // ... 
}; 

Это исключает программистов, используя вашу библиотеку писать using namespace myns но ... ну, как я уже говорил, я считаю, такой обходной путь весьма сомнителен.

Обратите внимание, что пользователи будут по-прежнему иметь возможность использовать псевдонимы типа, такие как:

using string = myns::string; 
Смежные вопросы