c – 仅为初始化列表使用命名空间

前端之家收集整理的这篇文章主要介绍了c – 仅为初始化列表使用命名空间前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在初始化列表中有很多命名空间用法,并希望使用using命名空间来减少冗长.但是,初始化列表超出了构造函数括号的范围,因此我必须将使用置于构造函数之外,并使用它污染文件的其余部分.有没有办法根据需要调整使用范围?而不是: @H_404_2@MyClass::MyClass() : m_one(nsConstants::ONE),m_two(nsConstants::TWO),m_three(nsConstants::THREE) {}

我想要:

@H_404_2@MyClass::MyClass() : using namespace nsConstants; m_one(ONE),m_two(TWO),m_three(THREE) {}

_

解决方法

你不能.该标准提供了一些不太好的选择: @H_404_2@// The stuff you want to use. namespace foo { namespace bar { class Frob {}; } }

现在,从污染最少到污染最严重.

typedef使得可以在类定义的私有部分中编写该别名:

@H_404_2@// I) class Schwarzschild { typedef foo::bar::Frob FbFrob; public: Schwarzschild () : a(FbFrob()),b(FbFrob()) {} private: FbFrob a,b,c; };

但是你也可以在全局范围内使用它,但有机会重命名它:

@H_404_2@// II) class Schwarzschild { public: Schwarzschild (); private: foo::bar::Frob a,c; }; // cxx-file typedef foo::bar::Frob FbFrob; Scharzschild::Scharzschild() : a(FbFrob()) {}

您还可以为命名空间添加别名:

@H_404_2@// III) namespace fb = foo::bar; class Planck { public: Planck () : a(fb::Frob()),b(fb::Frob()) {} private: fb::Frob a,c; };

或者您可以从其他命名空间中挑选符号,但缺点是您的Frob可能会与您的翻译单元中的另一个Frob发生冲突:

@H_404_2@// IV) using foo::bar::Frob; class Mach { public: Mach () : a(Frob()),b(Frob()) {} private: Frob a,c; };

仅仅为了完整起见,最污染的解决方案是使用命名空间.

@H_404_2@// V) using namespace foo::bar; class Newton { public: Newton () : a(Frob()),c; };

请注意,III,IV和V也可以限制在您的cxx文件中,就像Schwarzschild示例中一样.

原文链接:https://www.f2er.com/c/118171.html

猜你在找的C&C++相关文章