C++ 内联命名空间
示例
inlinenamespace在封闭的名称空间中包含内联名称空间的内容,因此
namespace Outer { inline namespace Inner { void foo(); } }
大部分相当于
namespace Outer { namespace Inner { void foo(); } using Inner::foo; }
但是from的元素Outer::Inner::和与之关联的元素Outer::是相同的。
所以跟随是等效的
Outer::foo(); Outer::Inner::foo();
usingnamespaceInner;对于某些棘手的部分,替代方法将不等同于模板专门化:
对于
#include <outer.h> //见下文 class MyCustomType; namespace Outer { template <> void foo<MyCustomType>() { std::cout << "Specialization"; } }
内联名称空间允许对Outer::foo
//外部
//包括卫队为简化起见
namespaceOuter
{
inlinenamespaceInner
{
template<typenameT>
voidfoo(){std::cout<<"Generic";}
}
}
而usingnamespace不允许专业化Outer::foo
//外部
//包括卫队为简化起见
namespaceOuter
{
namespaceInner
{
template<typenameT>
voidfoo(){std::cout<<"Generic";}
}
usingnamespaceInner;
//无法对Outer::foo进行专业化
//它应该是`Outer::Inner::foo`。
}
内联名称空间是一种允许多个版本同居并默认为inline一个版本的方法
namespace MyNamespace { //内联最新版本 inline namespace Version2 { void foo(); //新版本 void bar(); } namespace Version1 //老一 { void foo(); } }
并随着使用
MyNamespace::Version1::foo(); //旧版本 MyNamespace::Version2::foo(); //新版本 MyNamespace::foo(); //默认版本:MyNamespace::Version1::foo();