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;
//...
}
或者,还有更好的方法?
解决方案
该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;
//...
}