? ? 在c++11后 一个namespace (子命名空间)可以通过inline 修饰,将其中的函数和类型export到其外层的namespace(父命名空间)中,并且这种export是可以传递的。
? ? 这个特性能够支持一些有意思的实现,比如在接口功能升级的时候可以实现无需用户改动接口的调用直接默认使用新功能接口的神奇效果。
#include <iostream>
namespace 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) {
/* 同一命名空间内 inline 修饰的子命名空间,可以直接访问 */
MyClassSpace::ClassCSpace::C c;
c.func();
/* inline namespace 的可传递 */
TransGrandParent::TransParent::TransSun::trans();
TransGrandParent::TransParent::trans();
TransGrandParent::trans();
/* 利用 inline namespace 实现指定默认函数版本 */
FuncSpace::V100::func();
FuncSpace::V101::func();
FuncSpace::func();
return 0;
}
|