6

如何将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 语法。从功能上讲,允许 using 语句感觉很重要,因为something_long::tada(c)每个using something_long::tada; tada(c)Koenig 查找可能具有不同的行为。

4

3 回答 3

3

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

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

foo::foo(int a, int b, int c) : a(a), b(b), c(SVLI::tada(c)) {}
于 2013-05-08T06:23:46.467 回答
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))
{
}

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

于 2013-05-08T03:37:18.393 回答
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但是,这不会污染标准实现文件中的命名空间。

希望这可以帮助!

于 2013-05-08T03:22:00.433 回答