防止第三方使用我的整个命名空间

Prevent third party from using my entire namespace

本文关键字:命名空间 我的 第三方      更新时间:2023-10-16

尽管我已经搜索过,但我不知道这是否可以。

如何阻止库用户在他/她的代码中的任何地方编写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;

这将有助于命名空间碰撞。

你不能。标准说可以写using namespace myns;以获取所有名称,您对此无能为力。

如果用户在using namespace XXX;之后发生碰撞,那是他们自己的错。通常,如果尝试尝试,就不可能阻止人们射击自己。

最后,从某些第三方名称空间中汲取所有名称并不是偶然发生的事情,而是自时发生以来一直不鼓励的。如果用户决定无论如何都会做到这一点,他们最好知道自己在做什么。确实不是库维护者的问题。

一个(可疑的)解决方法是,我能想到的是用同名的类或结构替换您的名称空间,并将您的名称空间中的所有内容变成此类的(静态)成员。

struct myns final
{
    class MyClass
    {
    }
    class string
    {
    }
private:
    // private constructor, copy constructor and assignment operator
    // ...
};

这将排除程序员,使用您的库编写using namespace myns,但是...好吧,就像我说的那样,我认为这样的解决方法很可疑。

请注意,用户仍然可以使用类型的别名,例如:

using string = myns::string;