2013-08-12 2 views
0

나는 비주얼 스튜디오 2005을 사용하고 있는데 나는 그런 방법/기능을 가지고있다 적절한 사용 유형이어야합니다. 예를 들어 "I"로 64 비트 정수 유형의 경우 "UI"는 64 비트 부호없는 정수 유형이어야합니다.C++ 템플릿 정수 타입 적절한 부호없는 형식

어떻게하면됩니까?

둘째, "I"가 항상 정수 유형이 될 수 있습니까?

세 번째로 Boost를 사용할 수 없습니다.

답변

3

직접 형질을 구현할 수 있습니다. 라이브러리는 더 좋을 수도 사용하지만, 당신이 사용할 수없는 경우 자신의 당신, 당신은 그것을 할 필요가 :

template<class T> 
struct make_unsigned; // no implementation 

template<> 
struct make_unsigned<int> 
{ 
    typedef unsigned int type; 
}; 

template<> 
struct make_unsigned<unsigned int> 
{ 
    typedef unsigned int type; 
}; 

// and all other types you need ... (possibly implemented with help of a macro) 

및 코드에서

이 : 물론

template<typename I> 
void MyFunction(I &value) 
{ 
    //some operations 

    typedef make_unsigned<I>::type UI; 
    UI unsigned_type = static_cast<UI>(value); 
} 

이 완벽하지 않다 코드에서 컴파일 타임에 오류가 표시되고이를 수정할 수 있습니다.

편집 : 경우 I 컴파일이 실패 정수 유형 (유형이있는 전문화가 존재)하지 않습니다.

+0

'make_signed'가 아니라'make_unsigned'가 필요합니다. – Nawaz

+0

@Nawaz 감사합니다. 나는 그것을 바 꾸었습니다. 그러나 해결책은 simular입니다. –

3

VS2005에서 두려워요. 당신은 그 일을 간단하게 할 수 없습니다. (나는 그 정도까지 C++ 11을 지원하지 않는다고 생각합니다.) C++ 11에서는 std::is_signed<I>::value을 사용하여 I이 서명되어 있는지 확인하고 해당 서명되지 않은 유형을 얻으려면 std::make_unsigned<I>::type을 사용할 수 있습니다.

+0

예, 정수 값인지 쉽게 확인할 수도 있습니다. 그러나 VS2005는 C++ 11을 지원하지 않습니다. – Dejwi

+0

'std :: make_unsigned'가 STL 헤더에서 구현되는 방법을 볼 수 있습니다. 일부 유형 특성은 구현하기 어렵지 만, 다른 유형 특성은 SFINAE 또는 컴파일러 내장 함수를 필요로합니다. – lapk

+0

글쎄, "그럴 수 없다"는 정답이 아닐까? – jrok

3

부스트를 사용할 수없는 경우 사용자는 몇 가지 유형 특성 기계를 직접 구현할 수밖에 없습니다. 조금 지루할 수도 있지만 다음과 같이 할 수 있습니다.

+0

나는 당신의 대답을 많이 편집했습니다. 희망하지 않았습니까? :-). +1 BTW. – Nawaz

+0

당신이 그것을 깨뜨리지 않는 한 나는 상관하지 않는다. :) – jrok