gpt4 book ai didi

c++ - 仅将命名空间用于初始化列表

转载 作者:可可西里 更新时间:2023-11-01 18:38:01 26 4
gpt4 key购买 nike

我在初始化列表中使用了很多 namespace ,并且希望使用 namespace 来减少冗长。然而,初始化列表在构造函数大括号的范围之外,所以我必须将 using 放在构造函数之外,并用它污染文件的其余部分。有没有办法根据我的需要确定使用范围?而不是:

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;
};

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

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

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

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

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

关于c++ - 仅将命名空间用于初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8518164/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com