【问题标题】:using namespace just for initialiser list仅将命名空间用于初始化列表
【发布时间】:2011-12-15 09:56:16
【问题描述】:

我在初始化列表中有很多命名空间使用,并希望 使用命名空间 来减少冗长。但是初始化列表超出了构造函数大括号的范围,所以我必须将 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)
{}

_

【问题讨论】:

  • 它是什么语言?请适当标记。
  • 抱歉 Tomasz,感谢您的评论。编辑添加 C++ 标签。
  • 为避免混淆应将其称为“ctor-initializer”,因为 C++ 语法元素“initializer-list”是另外一回事({} 之间的部分用于聚合初始化程序)。使用“污染”文件的其余部分有什么不好?这是您的 .cxx 文件,而不是标题,所以应该没问题。另一种选择是做using nsConstants::ONE;,但你想要的是不可能的。
  • 嗨 PlasmaHH,我是程序员而不是编译器编写者,所以我更喜欢在用户范围内使用语言,例如 C++ FAQ。我想这样我会更准确。就我而言,污染不好,因为我使用命名空间来防止名称冲突。谢谢你的想法。

标签: c++ list namespaces using


【解决方案1】:

你不能。该标准提供了一些不太好的替代方案:

// 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 示例中一样。

【讨论】:

  • 感谢您非常完整的回答 phresnel,我在命名空间中有很多类型,这意味着 I、II 和 IV 中有很多额外的代码。 III 缩短了命名空间,但在我的情况下它已经很短了,而 V 是我想要避免的。所以在这种情况下,我会坚持我原来的代码。
【解决方案2】:

这显然是不可能的。在 C++ 中不存在像“本地使用”这样的东西。所以你必须坚持使用范围运算符或使用using。

【讨论】:

  • >> 在 C++ 中没有像“本地使用”这样的东西。好吧,我的意思是: void myFunction() { using namespace nsConstants;我=一; } 在 C++ 中。有关详细信息,请参阅 stackoverflow 上的许多其他条目。 (抱歉,我无法将其格式化为代码。)
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2018-07-15
相关资源
最近更新 更多