首页 > 解决方案 > 处理在多个命名空间范围内声明的对象的最佳实践

问题描述

因此,无论出于何种原因,如果您在多个嵌套命名空间中声明了一些对象,并且您需要在这些命名空间之外的函数中使用它,那么处理过多噪音的最佳做法是什么?

重构以下内容是否可以接受:

void doWidgetThings
{
    NamespaceA::NamespaceB::NamespaceC::Widget widget1;
    NamespaceA::NamespaceB::NamespaceC::Widget widget2;
    //...
}

至:

void doWidgetThings
{
    typedef NamespaceA::NamespaceB::NamespaceC::Widget  Widget;

    Widget widget1;
    Widget widget2;
    //...
}

或者,还有更好的方法?

标签: c++

解决方案


using关键字对 C++ 来说更惯用,尽管typedef完全没问题。该typedef关键字是为了向后兼容而保留的,并且不能为模板类型加上别名,因此using在 C++11 标准中引入。因此,如果您需要为模板类型设置别名,您的代码可以通过使用using.

你可以像这样重写你的例子

void doWidgetThings()
{
    using NamespaceA::NamespaceB::NamespaceC::Widget;
    Widget widget1;
    Widget widget2;
    //...
}

如果要重命名Widget类型以避免任何名称冲突,可以编写

void doWidgetThings()
{
    using MyWidget = NamespaceA::NamespaceB::NamespaceC::Widget;
    MyWidget widget1;
    MyWidget widget2;
    //...
}

如果你碰巧有一个模板参数,你也可以像这样参数化它:

void doWidgetThings()
{
    template <class A> using MyWidget = NamespaceA::NamespaceB::NamespaceC::Widget<A>;
    MyWidget<int> widget1;
    MyWidget<int> widget2;
    //...
}

推荐阅读