在C ++中,什么是“命名空间别名”?
什么是C ++中的“命名空间别名”? 它是如何使用的?
命名空间别名是通过一个不同的简短名称引用长名称空间名称的一种便捷方式。
举个例子,假设你想使用Boost的uBLAS中的数字向量而不using namespace
指令。 每次说出完整的命名空间是很麻烦的:
boost::numeric::ublas::vector<double> v;
相反,你可以为boost::numeric::ublas
定义一个别名 – 比如说我们想把它缩写为ublas
:
namespace ublas = boost::numeric::ublas; ublas::vector<double> v;
很简单,#定义将不起作用。
namespace Mine { class MyClass { public: int i; }; } namespace His = Mine; namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; }
编译好。 让您解决名称空间/类名称冲突。
namespace Nope { class Oops { public: int j; }; } #define Hmm Nope namespace Drat { class Nope: public Hmm::Oops { void f () { j = 1; } }; }
在最后一行,“Hmm:Oops”是一个编译错误。 预处理器将其更改为Nope :: Oops,但Nope已经是类名称。
这完全是为一个looong命名空间名称select一个别名,例如:
namespace SHORT = NamespaceFirst::NameSpaceNested::Meow
然后,可以键入def
typedef SHORT::mytype
代替
typedef NamespaceFirst::NameSpaceNested::Meow::mytype
此语法仅适用于名称空间,不能在namespace NAME =
之后包含类和types
另请注意,命名空间别名和使用指令在编译时parsing,而不是运行时。 (更具体地说,它们都是用来告诉编译器在parsing名称时还有什么地方需要查看的工具,如果在当前作用域或其父作用域中找不到特定的符号)。例如,这两个工具都不会编译:
namespace A { int foo; namespace AA { int bar; } // namespace AA namespace AB { int bar; } // namespace AB } // namespace A namespace B { int foo; namespace BA { int bar; } // namespace BA namespace BB { int bar; } // namespace BB } // namespace B bool nsChooser1, nsChooser2; // ... // This doesn't work. namespace C = (nsChooser1 ? A : B); C::foo = 3; // Neither does this. // (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.) if (nsChooser1) if (nsChooser2) using namespace A::AA; else using namespace A::AB; else if (nsChooser2) using namespace B::BA; else using namespace B::BB;
现在,一个好奇心可能已经注意到constexpr
variables也在编译时使用,并且怀疑它们是否可以与别名或者指令一起使用。 据我所知,他们不能,虽然我可能是错的。 如果您需要在不同名称空间中使用同名命名的variables,并dynamicselect它们,则必须使用引用或指针。
// Using the above namespaces... int& foo = (nsChooser1 ? A::foo : B::foo); int* bar; if (nsChooser1) { if (nsChooser2) { bar = &A::AA::bar; } else { bar = &A::AB::bar; } } else { if (nsChooser2) { bar = &B::BA::bar; } else { bar = &B::BB::bar; } }
上述的有用性可能是有限的,但它应该达到目的。
(对于上面我可能错过的任何错误,我很抱歉。)