2017-04-04 1 views
2

I가 다음과 같은 함수 템플릿잘못된 캐스트 오류는 일반적인 유형에 따라 달라집니다

template<typename T> 
T foo(){ 
    if(std::is_same<T,int>::value){ 
     return 1; 
    } 
    if(std::is_same<T,std::string>::value){ 
     return "Hello"; 
    } 
} 

I는 다음과 같이 적용 할 :

int main(){ 
    std::cout << foo<int>() << std::endl; // 1 
    std::cout << foo<string>() << std::endl; // "Hello" 
} 

내가 컴파일하려고하면 내 템플릿 컴파일러에서 다음과 같은 오류가 발생합니다 : error: cannot initialize return object of type 'int' with an lvalue of type 'const char [6]'.

if 문을 모두 제거하면 올바른 결과를 얻을 수 있으므로 std::is_same<T,int>::value이 의도 한대로 작동합니다.

컴파일러가 T의 유형을 감지 것 같다, 모든 return 진술이 일치하고 std::string 암시 int 스트 없기 때문에 오류가 발생합니다 확인합니다.

누구나 내 의도를 충족시키는 해결책이나 다른 해결책이 있습니까?

편집

내 의도를 설명하기 : I 데이터베이스 커서 클래스의 래퍼 클래스를 쓰고 있어요. 이러한 커서는 보통 정의되어 있으므로 getInt() 또는 getString()과 같은 여러 멤버 함수가 있습니다. 내 생각은 T에 따라 해당하는 커서 멤버 함수를 사용하는 일반 get<T>()을 구현하는 것이 었습니다.

+0

C++ (17) 당신이 의지를 일부 컴포넌트를 컴파일 할 수 없도록하는'if constexpr'을 얻으십시오. 지금 당장 코드의 모든 부분은 * all * 가능한 유형'T'에 대해 유효해야합니다. 함수에 별도의 오버로드를 추가해야합니다. –

답변

1

는, 컴파일러가 템플릿에서 다음과 같은 기능을 생성을 컴파일러에서 알 수 있듯이 int은 C 문자열 (char const [N])로 초기화 할 수 없으므로 형식이 잘못되었습니다. 물론 해당 return 문에 도달하지는 않겠지 만 이는 단순히 "최적화 알고리즘"인 "불필요한 코드 제거"로 알아낼 수 있습니다.

당신이 그것을 예상하는 방식 코드 경로를 폐기 할 수있는 우리가 if constexpr를 얻을 수 있습니다 C++ 17 "지금"Dustin's answer에 표시되는 솔루션 :

template<typename T> 
T foo(){ 
    if constexpr (std::is_same<T,int>::value){ 
     return 1; 
    } 
    if constexpr (std::is_same<T,std::string>::value){ 
     return "Hello"; 
    } 
} 
2

문 경우 잊고 완전히 템플릿 함수 전문 : 코드 위

int foo<int>(){ 
    if(true){ 
     return 1; 
    } 
    if(false){ 
     return "Hello"; 
    } 
} 

병입니다 : 당신이 foo<int> 참조하면

template<> 
int foo<int>(){ 
    return 1; 
} 

template<> 
std::string foo<std::string>(){ 
    return "Hello"; 
} 
+0

원래 코드가 작동하지 않는 이유를 이해하려면 원래 템플리트의 모든 'T'항목을'int'로 바꾸십시오. 이는 본질적으로'foo ()'을 호출 한 결과입니다. 그렇다면'int'를 리턴하여'string'을 리턴하려고 선언 한 함수가 있다는 것이 명백해집니다. – Alain

+0

참고 : 명시 적 인스턴스가 아니라 템플릿 전문 분야입니다. [여기를 참조하십시오 (http://stackoverflow.com/a/4933205/1116364). –

+1

완전히 전문화했다는 말을 했어야했는데 .. 편집 했어. 감사합니다 –

관련 문제