2011-06-14 6 views
10

이 질문은 C++과 관련이 있습니다C++에서 조건부 typedef를 사용할 수 있습니까?

Solver < TS, FS>라는 클래스를 선언하는 라이브러리가 있습니다. 솔버는 지역의 값에 따라 (내가 쓴) 다른 클래스 도메인

지금은 회원이 "INT 영역을"많은 도메인이 있습니다

내가하고 싶은 것은의 구성원, 내가 원하는 솔버가 TS와 FS에 대해 다른 인수를 수락하도록합니다. 내가 구조체는 쓸모없는 것 같다, 만약 인해의 범위에 여기, 그러나

Decider<region>::TS 
Decider<region>::FS 

로 사용

template<int region> 
struct Decider 
{ 
    if(region==1) 
    { 
    typedef TSA TS; 
    typedef FSA FS; 
    } 
    else 
    if(region==2) 
    { 
    typedef TSB TS; 
    typedef FSB FS; 
    } 
} 

나중에 라인을 따라 뭔가 생각했다. 그러나, 나는 이것을하는 더 나은 방법을 생각할 수 없다. 어떤 제안?

모든 다른 TS와 FS는 동일한 인터페이스를 가지고 있습니다. 따라서 내부 코드에 대해 걱정할 필요가 없습니다.

답변

15

region 값에 대해 템플릿을 전문화 할 수 있습니다.

template<int region> 
struct Decider; 

template<> 
struct Decider<1> 
{ 
    typedef TSA TS; 
    typedef FSA FS; 
}; 

template<> 
struct Decider<2> 
{ 
    typedef TSB TS; 
    typedef FSB FS; 
}; 
+0

템플릿 인수는 컴파일시 상수 여야합니다. OP가 멤버 변수'int region'을 인수로 사용하기를 원했기 때문에이 솔루션이 필요를 충족시키지 않을까 걱정됩니다 (물론 질문을 오해했을 수도 있습니다.) –

+0

예 .... 그것을 int 영역으로 가지고있는 것이 바람직 할 것입니다. 그러나 저는 컴파일 타임 상수 tooo를 관리 할 수 ​​있다고 생각합니다. 그냥 코드를 길게 만들 것입니다 ....... –

+0

제가 이처럼 할 수 있는지 확인 하시겠습니까? '디 사이더를 사용하여 :: TS; 솔버 해결 자();' –

9

템플릿 특수화를 사용해야합니다. 버전을 선택합니다 ++

template <int region> 
struct Decider; 

template <> 
struct Decider<1> 
{ 
    typedef TSA TS; 
    typedef FSA FS; 
}; 

template <> 
struct Decider<2> 
{ 
    typedef TSB TS; 
    typedef FSB FS; 
}; 

C는 제공된 region에 따라 사용할 수 있습니다.

물론 다른 지역 번호와 마찬가지로 이것을 확장 할 수 있습니다.

+0

지역 = 1에 대한 정의 하나와 지역에 대한 다른 정의! = 1을 원한다고 가정 해 봅시다. –

5

컴파일 시간 상수를 기준으로 Decider을 매개 변수화해야하는 경우 템플릿 전문화를 사용할 수 있습니다 (다른 답변 참조).

런타임 값 region에 따라 Decider을 매개 변수화해야하는 경우 매개 변수화를 런타임에도 지연해야합니다. 보통 이것은 일종의 생성 함수 또는 공장 관용구를 통해 수행됩니다. 누군가가 지금이 가로 질러 주셔서

+0

고마운 ..... 나는 그걸 살펴볼 것이다 ... –

+0

나는 공장 방법을 들여다 보았다 ... 나는 내가 그걸로 갈 것이라고 생각한다 ... 고마워 ... –

2

참고 :이 type_trait boost::conditional를 사용하여 부스트 라이브러리를 사용하여이 작업을 수행 할 수 있습니다

.

typedef boost::conditional<condition, type_if_true, type_if_false> MyTypeDef; 

condition은 여전히 ​​true 또는 false로 평가되는 컴파일 타임 표현식이어야합니다. 이렇게하면 몇 줄의 차이만으로 전체 수업을 전문화하지 않아도됩니다.

+0

정말 놀랍다. 굉장한!! :-) –

관련 문제