在c++11后 一个namespace (子命名空间)可以通过inline 修饰,将其中的函数和类型export到其外层的namespace(父命名空间)中,并且这种export是可以传递的。
这个特性能够支持一些有意思的实现,比如在接口功能升级的时候可以实现无需用户改动接口的调用直接默认使用新功能接口的神奇效果。
#includenamespace MyClassSpace { namespace ClassASpace { class A { public: int m_a = 0; }; } inline namespace ClassBSpace { class B { public: int m_b = 0; }; } inline namespace ClassCSpace { class C { public: ClassASpace::A a; B b; void func(void) { std::cout << "classA::a.m_a = " << a.m_a << "; classB::b.m_b = " << b.m_b << std::endl; } }; } }; namespace TransGrandParent { inline namespace TransParent { inline namespace TransSun { void trans(void) { std::cout << "TransSun::trans()" << std::endl; } } } } namespace FuncSpace { namespace V100 { void func(void) { std::cout << "V100" << std::endl; }; } namespace V101 { void func(void) { std::cout << "V101" << std::endl; }; } inline namespace V102 { void func(void) { std::cout << "V102" << std::endl; }; } }; int main(int argc, const char** argv) { MyClassSpace::ClassCSpace::C c; c.func(); TransGrandParent::TransParent::TransSun::trans(); TransGrandParent::TransParent::trans(); TransGrandParent::trans(); FuncSpace::V100::func(); FuncSpace::V101::func(); FuncSpace::func(); return 0; }



