只为初始化列表使用名称空间
我在初始化列表中有很多名称空间的用法,并希望使用名称空间来减少冗长。 然而,初始化列表超出了构造函数大括号的范围,因此我必须将构造函数外部的使用放在构造函数之外,并用它来污染文件的其余部分。 有没有办法根据需要来限制使用范围? 而不是:
MyClass::MyClass() :
m_one(nsConstants::ONE),
m_two(nsConstants::TWO),
m_three(nsConstants::THREE)
{}
我想要:
MyClass::MyClass() :
using namespace nsConstants;
m_one(ONE),
m_two(TWO),
m_three(THREE)
{}
_
你不能。 该标准提供了一些不太好的选择:
// The stuff you want to use.
namespace foo { namespace bar {
class Frob {};
} }
现在,从污染最小到污染最严重 。
typedef
使得可以在你的类定义的private
部分中写入该别名:
// I)
class Schwarzschild {
typedef foo::bar::Frob FbFrob;
public: Schwarzschild () : a(FbFrob()), b(FbFrob()) {}
private: FbFrob a,b,c;
};
但是,您也可以在全局范围内使用它,但有机会对其进行重命名:
// II)
class Schwarzschild {
public: Schwarzschild ();
private: foo::bar::Frob a,b,c;
};
// cxx-file
typedef foo::bar::Frob FbFrob;
Scharzschild::Scharzschild() : a(FbFrob()) {}
你也可以别名命名空间:
// III)
namespace fb = foo::bar;
class Planck {
public: Planck () : a(fb::Frob()), b(fb::Frob()) {}
private: fb::Frob a,b,c;
};
或者您可以从其他命名空间挑选符号,但缺点是您的Frob
可能会与您的翻译单元中的另一个Frob
发生冲突:
// IV)
using foo::bar::Frob;
class Mach {
public: Mach () : a(Frob()), b(Frob()) {}
private: Frob a,b,c;
};
只是为了完整性,最污染的解决方案是using namespace
。
// V)
using namespace foo::bar;
class Newton {
public: Newton () : a(Frob()), b(Frob()) {}
private: Frob a,b,c;
};
请注意,III,IV和V也可以限制在您的cxx文件中,就像在Schwarzschild示例中一样。
这显然是不可能的。 在C ++中不存在像“本地使用”这样的东西。 所以你必须要坚持的范围操作或使用中using
。