2012-02-20 5 views
0


템플릿 클래스의 함수에서 float to bool 변환 성능 경고를 제거하려고하는데이 경우 boost::enable_if이 과도한 사용으로 느껴집니다.C++ 템플릿 클래스에서 성능 경고 제거

아마도 컴파일 타임에 템플릿 유형을 확인한 다음 유형에 따라 적절한 캐스팅을 사용할 수 있습니까? 난 그냥 경고를 해제하지 선호

#if (boost::is_same<CType, bool>::value == true) 
     val = (val+val2)!=0; 
    #else 
     val = (T)(val+val2); 
    #endif 


:

T val; 
    float val2; 
    val = (T)(val+val2); // warning here for objects of type bool 


나는 이런 식으로 뭔가를 할 수 있습니다. bool에 대한 별도의 템플릿에 밖으로 작업을 당길 수

+0

스택 오버플로에 오신 것을 환영합니다! complier 경고는 사용중인 컴파일러에 따라 다릅니다. 이 질문을 컴파일러에 적절하게 태그하십시오. –

+2

bool 유형의 템플릿을 특수화 할 수 있습니다. – Collin

+0

콜린 고맙습니다. 그러나 한 가지 경고를 수정하는 전문 분야를 만드는 것은 나에게 과도한 잔인한 것처럼 보입니다. 확실히 더 편리한 방법이 있어야할까요? – s0ndeb0k

답변

6

추가 비주얼 스튜디오 태그 및 과부하 :

편집

template <typename T1, typename T2> 
T1 add(T1 const & v1, T2 const & v2) { 
    return static_cast<T1>(v1 + v2); 
} 

template <typename T2> 
bool add(bool v1, T2 const & v2) { 
    return (v1 + v2) != 0; 
} 

T val; 
float val2; 
val = add(val,val2); // hopefully no warning now. 
2

그냥 위해 '전문'에 대한 경우 블록으로 is_same를 사용 bool. Boost를 사용하지 않으려는 경우 표준 라이브러리의 일부입니다.

template<typename T> 
void foo(T val1) { 
    T val; 
    float val2; 

    if (std::is_same<T, bool>::value == true) 
     val = (val1 + val2) != 0; 
    else 
     val = val1 + val2; 
} 

이 함수는 템플릿 기능이기 때문에 컴파일러가 분기를 최적화하여 실제 템플릿 전문화와 동일한 결과를 얻을 것으로 기대합니다.

관련 문제