나는 비주얼 스튜디오 2005을 사용하고 있는데 나는 그런 방법/기능을 가지고있다 적절한 사용 유형이어야합니다. 예를 들어 "I"로 64 비트 정수 유형의 경우 "UI"는 64 비트 부호없는 정수 유형이어야합니다.C++ 템플릿 정수 타입 적절한 부호없는 형식
어떻게하면됩니까?
둘째, "I"가 항상 정수 유형이 될 수 있습니까?
세 번째로 Boost를 사용할 수 없습니다.
나는 비주얼 스튜디오 2005을 사용하고 있는데 나는 그런 방법/기능을 가지고있다 적절한 사용 유형이어야합니다. 예를 들어 "I"로 64 비트 정수 유형의 경우 "UI"는 64 비트 부호없는 정수 유형이어야합니다.C++ 템플릿 정수 타입 적절한 부호없는 형식
어떻게하면됩니까?
둘째, "I"가 항상 정수 유형이 될 수 있습니까?
세 번째로 Boost를 사용할 수 없습니다.
직접 형질을 구현할 수 있습니다. 라이브러리는 더 좋을 수도 사용하지만, 당신이 사용할 수없는 경우 자신의 당신, 당신은 그것을 할 필요가 :
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
컴파일이 실패 정수 유형 (유형이있는 전문화가 존재)하지 않습니다.
VS2005에서 두려워요. 당신은 그 일을 간단하게 할 수 없습니다. (나는 그 정도까지 C++ 11을 지원하지 않는다고 생각합니다.) C++ 11에서는 std::is_signed<I>::value
을 사용하여 I
이 서명되어 있는지 확인하고 해당 서명되지 않은 유형을 얻으려면 std::make_unsigned<I>::type
을 사용할 수 있습니다.
'make_signed'가 아니라'make_unsigned'가 필요합니다. – Nawaz
@Nawaz 감사합니다. 나는 그것을 바 꾸었습니다. 그러나 해결책은 simular입니다. –