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

using namespace just for initialiser list

本文关键字:命名空间 列表 初始化      更新时间:2023-10-16

我在初始化器列表中使用了很多命名空间,并且希望使用命名空间来减少冗长。然而,初始化器列表在构造函数大括号的范围之外,所以我必须使用将放在构造函数之外,并用它污染文件的其余部分。是否有一种方法来确定我想要的使用范围?而不是:

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