2014-12-05 3 views
1

내 템플릿에 쓰여진 내용을 기반으로 membervariable 유형을 변경하려고합니다.C++의 템플릿 유형 멤버 변수

예를 들어, A<64, 64>은 내 회원을 int_128로 만들어야합니다. 슬프게도, 저는 템플릿 유형을 사용하는 방법을 모르고 있으며 템플릿 기능 만 있으면 도움이됩니다.

내 클래스>

template<int x, int y> 
class A{ 

    private: 
    TYPETOBEGENERIC m_variable 
} 

인가 같은 방법은 내가 템플릿 < 내에서 특정 유형을 추가하지 않으

if(x+y <= 64){ TYPETOBEGENERIC = int_64 } 
    else{TYPETOBEGENERIC = int_128} 

처럼 생성자에서가 수행 보인다. 구조 A < 64, 64>는 변경되지 않아야합니다.

+0

C++에는 제네릭이 없으며 템플릿이 있으며 같은 것이 아니거나 그와 비슷하지 않습니다. – EJP

답변

4
constexpr bool lessThan64(int a,int b) { 
    return (a+b) < 64; 
} 
template<int x, int y> 
class A{ 
    using type = typename std::conditional<lessThan64(x,y),int_64,int_128>::type; 
    private: 
    type m_variable; 
} 

.

편집 : 두 가지 유형의 경우 variadic 템플릿 또는 명시 적 특수화를 사용할 수 있습니다.

template<unsigned int I,typename... Sizes> 
struct select; 

template<unsigned int I,typename T,typename... Sizes> 
struct select<I,T,Sizes...>:select<N-1,Cases...> 
{ 
}  

template<unsigned int I,typename T,typename... Sizes> 
struct select<O,T,Sizes...> 
{ 
    using type =T 
} 

You would obviously need a constexpr function to differentiate between the types. 
+0

이것은 내가 찾고있는 것이다. 고마워. – TreeOfLife

+0

당신은 환영합니다. 클리어 케이스가 오늘 시간을 낭비하고 있습니다. 기꺼이 도와 드리겠습니다. – West

+0

그냥 마지막 질문입니다. 여기에서 사용할 세 번째 변수를 넣으 려한다면, int_32를 예제로 말하면 어떻게 될까요? 이것을 바꿀 필요가있다. 표준 : true/false 상태에서만 작동하는 것으로 보입니다. – TreeOfLife

0

int_ 이후의 비트 수를 매개 변수화하기 위해 프로세서 전처리 명령을 사용할 수는 있지만 잘못된 프로그래밍입니다.

#define TYPE(bits) int_##bits 

지금 32 비트 정수는 TYPE(32) my_var; 쓰기 (예 : 유형이 존재한다고 가정)을 선언합니다. 당신이하려고하는 것은 무엇이든 할 수있는 더 좋은 방법이있을 것입니다. 우리가 컴파일시에 그 값을 평가하고 다음 두 가지 유형의 사이에서 선택하는 표준 : 조건을 사용할 수있는 시간 메타 프로그래밍 컴파일 얻을 constexpr 기능을 사용

관련 문제