2013-05-08 1 views
6

using 문을 생성자 초기화 목록에 어떻게 통합 할 수 있습니까? 예를 들어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)) {} 

을하고 싶은는 아마도이이 코드 영역에 필요한 구피 시도/캐치 구문과 같이 보입니다. 기능적으로, 진술을 사용하여 허용하는 것은 중요하다고 느낍니다. something_long::tada(c)using something_long::tada; tada(c)은 Koenig 조회마다 다른 동작을 할 수 있습니다.

답변

1

Very Gross Hack으로 할 수있는 한 가지 방법은 두 개의 개별 구현 파일을 만드는 것입니다. 구현 파일 중 하나는 을 구현하는 일반 구현 파일이며 생성자를 제외합니다. 생성자를 컴파일 할 때 두 번째 구현 파일에서, 당신은

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

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

그런 식으로 할 거라고, 컴파일러는 tada 짧게 만들 수있는 using 선언을해야합니다. 그러나 이것은 표준 구현 파일의 네임 스페이스를 오염시키지 않습니다.

희망이 도움이됩니다.

+0

아마도 새 기능에서'something_long :: tada (c)'를 (를) 정적 개인 기능처럼. – billz

+0

영리한,하지만 별도의 헤더 파일을 만드는 여분의 노력이 실제로 네임 스페이스를 입력해야하는 것을 알아 채지 못했습니다. – Yuushi

+0

@ Yuushi- 이것은 원칙적으로이 작업을 수행 할 수 있음을 보여주는 개념 증명입니다. 나는 완전히 동의하지만! – templatetypedef

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

을 네임 스페이스의 많은 수준보기의 유지 또는 코드의 가독성 지점에서, 입력 할 필요가있는 경우 명확한 네임 스페이스를 유지하는 것이 좋습니다.

+0

이것은 생성자 내에서 간결성을 제공하지만 Koenig 검색을 제공하지 않습니다. 'tada (c)'비트 위에'namespaceA :: namespaceB :: etc;'라인을 추가하여 내가 무엇을했는지 알 수 있습니다. 고맙습니다. –

3

네임 스페이스 별칭이 도움이됩니까?

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

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

이것은 내 길이 불만을 능가합니다. 가상의'c1'에서'SVLI'를 반복적으로 사용하면'c2','c3'는 모두'c'와 비슷하지만 Koenig 검색을 제공하지 않습니다. –

관련 문제