如何在不重复此代码的情况下将一些代码放入多个名称空间?

yak*_*kov 17 c++ namespaces code-duplication

假设我在两个不同的命名空间中定义了方法:

namespace foo
{
    void print()
    {
        //do work...
    }
}

namespace bar
{
    void print()
    {
        //do work...
    }
}
Run Code Online (Sandbox Code Playgroud)

foo::print()bar::print()功能是完全平等的.我的项目使用了这些函数的大量调用.

有没有办法删除其中一个print()定义而不更改这些函数的调用?我的意思是类似下面的东西(当然,C++语言不允许这种结构,它只是一个例子):

namespace foo, bar  //wrong code!
{
    void print()
    {
        //do work...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果没有办法按我的意愿重构代码,请告诉我,你喜欢以下决定吗?如果您的项目包含此类代码,您会感到高兴吗?:)

namespace foo
{
    void print()
    {
        //do work...
    }
}

namespace bar
{
    void print()
    {
        foo::print();
    }
}
Run Code Online (Sandbox Code Playgroud)

加:

谢谢你们,我对你的答案非常满意.我想让你澄清一下:using ::foo::print和之间有区别using foo::print吗?

Age*_*ien 18

您可以通过using声明来实现这一目标.

namespace foo
{
    void print()
    {
        //do work...
    }
}

namespace bar
{
    using foo::print;
}
Run Code Online (Sandbox Code Playgroud)

编辑

对于之间的区别::foo::printfoo::print:前面加上一个限定名::意味着你明确地提到一个全局命名空间.这可以用于选择全局的,即使在范围内有更多具有相同名称的项目.


Ale*_*aev 14

using宣言怎么样:

namespace foo
{
    void print()
    {
        // do work ...
    }
}

namespace bar
{
    using ::foo::print;
}
Run Code Online (Sandbox Code Playgroud)

使用::foo::print而不是foo::print重要的一点.如果你还有另一个foo内部bar:

namespace foo
{
    void print()
    {
        // 1 ...
    }
}

namespace bar
{
    namespace foo
    {
        void print()
        {
            // 2 ...
        }
    }

    using   foo::print; // refers to 2
    using ::foo::print; // refers to 1
}
Run Code Online (Sandbox Code Playgroud)

然后你会看到使用的优点::.总而言之,prepending ::是一种安全的方法,可以确保foo将来可能添加的另一个嵌套命名空间不会给您带来任何意外.

  • 关于::的提示很好,只要我们可以假设`foo`实际上是在全局命名空间中. (3认同)