2017-12-28 29 views
3

이 프로그램을 가지고 있다고 가정 해 보겠습니다.이 프로그램에는 특수 유형이 많으며 일반 유형이 필요하지 않습니다. 컴파일 할 때 "Error: Z" 대신 "Error: Int"을 받고 싶습니다. 내가 typeof(Z)을 시도했는데 그게 아무것도 못 알아 들었어. 표준 트릭이 있니?유형 이름을 static_assert 오류로 가져 오려면 어떻게해야합니까?

template<class Z> 
Z derp() 
{ 
    static_assert(false, "Error: Z"); 
} 

template <> 
double derp<double>() 
{ 
    return 5; 
} 


int main() 
{ 
    double b = derp<double>(); 
    int r = derp<int>(); 
    return 0; 
} 

답변

3

엄밀히 말하면, 프로그램은 [temp.res]/8을 위반 정적 주장의 계정에 필요하지 진단을 잘못 형성되지 않는다. 그러나 그것은 쉽게 고칠 수 있습니다. 기본 템플릿을 삭제 된 것으로 정의 할 수 있습니다.

template<class Z> 
Z derp() = delete; 

template<> 
double derp<double>() 
{ 
    return 5; 
} 


int main() 
{ 
    double b = derp<double>(); 
    int r = derp<int>(); 
    return 0; 
} 

이제 1 차 특수화가 실제로 호출되지 않으면 프로그램이 올바르게 구성됩니다. 대부분의 컴파일러는 원하는 오류 메시지를 제공합니다. Clang 5.0 :

prog.cc:14:13: error: call to deleted function 'derp' 
    int r = derp<int>(); 
      ^~~~~~~~~ 
prog.cc:2:3: note: candidate function [with Z = int] has been explicitly deleted 
Z derp() = delete; 
^