2017-01-10 3 views
6

임의의 수의 유형을 사용하고 기본 아키텍처 및 운영 체제의 크기를 표시하는 템플릿 함수를 작성했습니다. 그러나이 함수는 실제 유형과 별개이므로 실제 유형 인 것처럼 평가됩니다.컴파일 타임에 별칭과 실제 유형을 구별 할 수 있습니까?

그러나 컴파일 타임에 별칭과 기본 제공 형식을 구분하고이를 기반으로 출력을 바꿀 수 있기를 원합니다.

func<unsigned int, size_t>(); 

는 출력 : 그러나

Unsigned int is 4 bytes. 
Unsigned int is 4 bytes. 

, 나는 출력 별칭과 차별화 할 수있는 컴파일러가 필요 물론

Unsigned int is 4 bytes. 
size_t is an alias for unsigned int. 

처럼되고 싶어 내장 컴파일 할 때 입력하십시오.

그래서 C++ 버전에서 컴파일 할 때 실제 유형과 별칭을 구별 할 수 있습니까?

+2

새로운 사용자로부터 좋은 질문이 왔습니다. – Bathsheba

답변

6

대답은 할 수 없다는 것입니다. 지금입니다. 그러나 정적 반사에 대한 제안이 있습니다. http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0194r2.html

이 문서에서는 Operation get_base_name이 유형 이름을 반환합니다. 그러나 그들은 진술한다 :

meta :: Alias에 대해 호출 된 get_base_name은 별칭이 지정된 선언의 이름이 아닌 인 별칭을 반환합니다.

그런 다음 get_base_name 사용할 때 별명의 원래 형태를 얻기 위해 사용될 수있는, Operation get_aliased을 제공한다.

문서에서 예제 코드 :

using rank_t = int; 

using mR = reflexpr(rank_t); 
cout << "5:" << get_base_name_v<mR> << endl; 
cout << "6:" << get_base_name_v<get_aliased_m<mR>> << endl; 

다음과 같은 출력을 생성합니다

5:rank_t; 
6:int; 

보너스 : 당신은 지금이 시도에 관심이 있다면, 다음과 같은 문서, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0385r1.pdf은 GitHub의 clang 포크에 초기 실험 구현이 있음을 언급합니다 (https://github.com/matus-chochlik/clang/tree/reflexpr).

6

운이 다되었습니다.

유형이 원시 유형 또는 원시 유형의 typedef 인 경우 슬프게도 컴파일 타임이나 런타임에서 구분할 수 없습니다.

+0

이렇게 답하면 제가 실제로하고 싶습니다. 기본적으로, 당신은 속이고 프리 프로세서를 사용합니다. 정식 이름의 테이블을 유지 관리합니다. 사용 된 토큰이 정식 이름과 일치하지 않으면 별칭임을 알 수 있습니다. 그러나 만약 내가 해낸다면, 누군가 그것을 실제로 사용하게 될 것이고, 나는 칙칙한 느낌을 가질 것이다. – Yakk

+1

@Yakk 다시는 ... – Quentin