2013-04-18 3 views
0

기술적 인 질문은 물론 (기술적으로 가능하다면) 스타일 질문이기도합니다. 내 코드에는 파일을로드하고 조작하는 일련의 함수가 있습니다. 다른 구문이 기능은 별도의 네임 스페이스에 존재 있도록이 최소한의 예에서C++ : 프로그램 논리/조건부 네임 스페이스에서 네임 스페이스 사용?

namespace typeA { 
    void load(); 
    void manipulate(); 
}; 

namespace typeB { 
    void load(); 
    void manipulate(); 
}; 

, 분명히 내가 할 수 간단한 파일 형식을 검사하고 TYPEA 호출하는 조항이 있습니다 부하()와 b를 입력을 : 부하() 등을 입력하십시오.

그러나 네임 스페이스 별칭을 사용하여이 작업을 수행 할 수 있는지 궁금합니다. 그것은 네임 스페이스에 수십개의 함수가 호출되어서 모든 if/else 절을 ​​별도로 필요로하므로 코드를보다 깔끔하게 만듭니다.

내가 무엇을 시도했다 : 네임 스페이스 별칭 할당 줄에 오류가 컴파일되지 않습니다

namespace my_type = (ft == "type_A") ? typeA : typeB; 
... 
my_type::load(); 

.

이렇게하는 또 다른 방법이 있습니까/이와 같은 상황을 처리하는 일반적으로 허용되는 깨끗한 방법은 무엇입니까?

각 파일 유형에 대한 가상 클래스와 상속이 하나의 옵션이라고 가정합니다. 다른 사람들이 있습니까?

+0

네임 스페이스는 오는 다음 문자열의 사용을 선언합니다. 어떻게 작동할까요? – Infested

+0

템플릿을 사용할 수도 있습니다 ... – Nim

+0

@ 님 : 제안에 감사드립니다. 이 상황에서 어떻게 템플릿을 사용할 수 있습니까? 함수에 대한 입력은 문자열에 의해 전달되는 파일의 내용 만 다를 수 있습니다. – kmh

답변

2

이러한 네임 스페이스 별칭을 수행 할 방법이 없습니다.

3.4.6 및 스페이스 별명 [basic.lookup.udir] - 지시어를 사용하여 - 지정 또는 공간 - 앨리어스 정의에서 1 네임 스페이스 이름 또는 중첩의 이름에 대한 조회 중 -name-specifier는 네임 스페이스 이름 만 고려합니다.

당신은 이것을 해결하기 위해 partial template specialization을 사용합니다.

+0

포인터 주셔서 감사. 내 모든 함수에서 구조체를 생성 한 다음 사용자 정의 유형을 사용하여 어떤 구현을 관심 대상으로 지정하여이 작업을 수행하는 방법을 파악했다고 생각합니다.이 것이 좋은 스타일로 간주됩니까? – kmh

+0

@Martin 당신의 목표와 해결책을 정확히 이해했는지 확신 할 수 없으면 boost :: function과 boost :: bind (std :: function과 std :: bind in C++ 11)를 살펴 보시기 바랍니다. – alexrider

+0

@Martin 이것에 대한 가능한 해결책은 형질 구조체를 만드는 것입니다. 이제 다른 태그 유형을 전문으로합니다. 예를 들어, 표준 라이브러리가 반복 태그를 기반으로 알고리즘을 전달하는 방법을 살펴보십시오. [msdn] (http://msdn.microsoft.com/en-us/library/zdxb97eh(v=vs.71).aspx)에서 예제를 참조하십시오. –