2014-10-22 6 views
3
내가 오버로드 된 함수는 인수와 같은 유형으로 재정의하기 때문에 컴파일 실패 C++ (11) 코드를

의 차이를 테스트 컴파일러 매크로이 두 프리미티브 사이의 평등을 검사하기 위해 추가 할 수 있으며, 컴파일하기 전에 동등한 경우 두 번째를 생략 할 수 있습니까?컴파일러 매크로 uint64_t와 부호 없음 long long int와

다른 유형의 문자 포인터를 반환하는 다른 함수가 있습니다.

char const* foo(long long int) { return "%lld"; } 

그래서 종류가 사용하는 메모리 양을 확인하기 위해 부족한 것 같다 예를 들어,이를 추가하는 것은 signedunsigned long long int 바이트의 같은 번호를 사용하더라도, 나에게 어떤 문제가 발생하지 않습니다. 다른 접근법은 무엇입니까?

+2

SFINAE가있는 매크로가 필요 없습니다. – chris

+0

형식에서 printf 지정자를 결정하기위한 몇 가지 표준 라이브러리 지원을 확인 했습니까? –

+0

두 번째 오버로드의 반환 값을 다음과 같이 변경합니다. enable_if :: value, const typename char *> :: type; 이것은 @chris가 말하는 것입니다 –

답변

2

당신은 climitscstdint에서 정의를 사용하여 이러한 유형의 최대 값을 검사 할 수 있습니다 :

#include <climits> 
#include <cstdint> 

char const* foo(uint64_t) { return "%" PRIu64; } 

//ULLONG_MAX defined in climits, UINT64_MAX in cstdint 
#if ULLONG_MAX != UINT64_MAX 

char const* foo(unsigned long long int) { return "%llu"; } 

#endif 

그것은 아마도 템플릿을 사용하여 시스템을 만들 수 있지만 더 나은 장기적인 해결책이 될 것입니다.

+0

다른 플랫폼에서'ULLONG_MAX'가'UINT64_MAX'와 다를 수 있기 때문에 이것은 약합니다. –

+1

@RSahu : "다를 수 있습니다"(또는 오히려 동일 할 수 있음) 요점입니다. –

+0

@ Cheersandhth.-Alf,'unsigned long long int'가'uint128_t' (확실한 것은 없습니다) 인 경우 어떻게해야합니까? '# if' 문은 그 가능성을 보완하기 위해 확장되어야합니다. –