因此,无论出于何种原因,如果在多个嵌套名称空间中声明了一些对象,并且需要在这些名称空间之外的函数中使用它,那么处理多余噪声的最佳实践是什么?
重构如下内容是否可以接受:
void doWidgetThings
{
NamespaceA::NamespaceB::NamespaceC::Widget widget1;
NamespaceA::NamespaceB::NamespaceC::Widget widget2;
//...
}
收件人:
void doWidgetThings
{
typedef NamespaceA::NamespaceB::NamespaceC::Widget Widget;
Widget widget1;
Widget widget2;
//...
}
还是有更好的方法?
答案 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;
//...
}