使用语句是否出现在构造函数初始化列表中?

问题描述:

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

作为一个非常粗糙的文件,你可以做的一件事就是拥有两个单独的实现文件。其中一个实现文件将是一个正常的实现文件,在这个文件中,您将执行所有内容,但构造函数除外。在第二个执行文件,你会做

#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短。但是,这不会污染标准实施文件中的名称空间。

希望这会有所帮助!

+0

也许在新函数中包装'something_long :: tada(c)'?像静态私人功能。 – billz 2013-05-08 03:24:31

+0

聪明,但我不确定创建一个单独的头文件的额外努力确实击败了必须键入一个名称空间。 – Yuushi 2013-05-08 03:25:47

+0

@ Yuushi-这只是一个概念证明,表明原则上可以做到这一点。虽然我完全同意! – templatetypedef 2013-05-08 03:28:59

这取决于您需要输入多少级别的命名空间。如果您需要输入命名空间的相当多的水平,你可以在一个静态函数弥合它:

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)) 
{ 
} 

如果没有需要键入,从维持或代码的可读性点命名空间的多层次,保持清晰的命名空间会更好。

+0

这在构造函数中提供了简洁性,但它不提供Koenig查找。我们可以在'tada(c)'位之上添加'using namespaceA :: namespaceB :: etc;'行来完成我之后的工作。谢谢。 – 2013-05-13 14:13:06

命名空间别名有帮助吗?

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

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

这超越了我的长度投诉,比如说,当我在假想的'c1','c2','c3'中反复使用'SVLI'时,就像上面的'c'一样,但是它不提供Koenig查找。 – 2013-05-13 14:12:00