using语句是否可以出现在构造函数初始化列表中?

时间:2013-05-08 03:16:26

标签: c++ syntax constructor

如何将using语句合并到构造函数初始化列表中?

例如,而不是

foo::foo(int a, int b, int c) : a(a), b(b), c(something_long::tada(c)) {}

我想

// Invoking some 'using something_long::tada;' magic
foo::foo(int a, int b, int c) : a(a), b(b), c(tada(c)) {}

据推测,这看起来像是这个代码区域中所需的愚蠢的try / catch语法。从功能上讲,允许使用语句非常重要,因为something_long::tada(c)using something_long::tada; tada(c)每个Koenig查找可以有不同的行为。

3 个答案:

答案 0 :(得分:3)

命名空间别名会有帮助吗?

using SVLI = something::very::long::indeed;

foo::foo(int a, int b, int c) : a(a), b(b), c(SVLI::tada(c)) {}

答案 1 :(得分:2)

这取决于您需要键入多少级别的命名空间。如果需要输入相当多的命名空间级别,可以在静态函数中进行桥接:

class foo
{
  //...
  static int tada_again(int c)
  {
    return namespaceA::namespaceB::namespaceC::namespaceD::namespaceE::tada(c);
  }
  //...
};

foo::foo(int a, int b, int c) : a(a), b(b), c(tada_again(c))
{
}

如果没有多少级别的命名空间需要输入,从维护或代码可读性的角度来看,保持清除命名空间会更好。

答案 2 :(得分:1)

作为一个非常糟糕的黑客,你可以做的一件事就是拥有两个独立的实施文件。其中一个实现文件是一个普通的实现文件,您可以在其中实现除构造函数之外的所有。在第二个实现文件中,您将执行

#include "appropriate-header-file"
using namespace something_long;

foo::foo(int a, int b, int c): a(a), b(b), c(tada(c)) {};

这样,在编译构造函数时,编译器将使用using声明使tada缩短。但是,这不会污染标准实现文件中的命名空间。

希望这有帮助!