2017-09-03 14 views
-3

내 자신의 아카이브 시스템 관리 전화를 컴파일시에 표준 : : size_t와 유형을 감지 이는 컴파일러에 따라 다를 수 있습니다. 예를 들어 Linux 64 비트에서 gcc를 사용하는 경우 std::size_tunsigned long int이지만 Intel 64 비트 Windows에서 std::size_tunsigned long long int입니다. 단 하나 개의 라인이 어느 유형이 컴파일시에 알려져, 실행할 수 있습니다 그것은 추한 : 나는 행복하지 않다,나는 다음과 같은 가상 함수가 오른쪽 기능

void OutputArchive::save_size_t(std::size_t i) 
{ 
    if(boost::is_same<std::size_t,unsigned long int>::value) 
    this->save_unsigned_long_int((unsigned long int)i); 
    else if(boost::is_same<std::size_t,unsigned long long int>::value) 
    this->save_unsigned_long_long_int((unsigned long long int)i); 
    else { /* error management */ } 
} 

그러나, 제 1 방법에서, 나는 그런 일을 썼다. 전처리로 더 잘할 수 있다고 생각하지만, 어떻게 시작해야할지 모르겠습니다. 어떤 도움도 환영합니다.

참고 : 호환성 이유로 인해 C++ 11을 사용하지 않지만 Boost를 사용합니다.

+5

SFINAE의 유스 케이스처럼 보입니다. – user0042

+0

'std :: size_t'는 항상 타입 별칭입니다. 그렇지 않습니까? 이 두 가지 중 하나가 적용되는 경우 오버로드를 추가 할 필요가 없습니다. – StoryTeller

+11

'save_unsigned_long_int' 및'save_unsigned_long_long_int'? 과부하가있는 C++에 대한 전체 * 이유 *를 우회하지 않습니까? 인수에 여러 유형을 허용하는 * 하나의 * 함수 이름이 아닌 이유는 무엇입니까? – paxdiablo

답변

1

전처리 기는 유형에 대해 아무것도 모릅니다. 또는 범위. 또는 프로그램의 의미와 관련된 모든 것. 처리 할 수있는 모든 전처리 기는 작은 어휘 규칙 집합에 해당하는 문자 시퀀스 인 토큰입니다. 간단히 말해, 형식이 컴파일 타임에 알려져 있지만 전 처리기에 해당하는 변환 단계에서는 알 수 없습니다. C++은 적절한 오버로드 된 함수를 결정하고 올바른 템플릿 정의를 추론하기 위해 컴파일시에 유형 정보를 사용합니다. 둘 중 하나가 문제의 적절한 해결책이 될 수 있습니다.

C++ 표준은 size_t이 "부호없는 정수 유형"만 필요하다는 점에 유의할 가치가 있습니다. 표준 부호없는 정수 유형 (§ 3.9.1p1 참조) 일 필요가 없으므로 size_tunsigned int, unsigned long int 또는 unsigned long long int이 아닐 수 있습니다. 비슷한 내용이 ptrdiff_t 및 부호있는 정수 유형에 적용됩니다.