处理在多个名称空间范围内声明的对象的最佳实践

时间:2018-11-08 12:17:40

标签: c++

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

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

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

收件人:

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

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

还是有更好的方法?

1 个答案:

答案 0 :(得分:4)

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;
    //...
}