2012-11-29 3 views

답변

48

사용 is_same는 :

#include <type_traits> 

template <typename T> 
void foo() 
{ 
    if (std::is_same<T, animal>::value) { /* ... */ } // optimizable... 
} 

일반적으로, 그, 그래도 완전히 쓸모없는 디자인, 그리고 전문에 당신이 정말로 원하는 :

template <typename T> void foo() { /* generic implementation */ } 

template <> void foo<animal>() { /* specific for T = animal */ } 

참고 또한 함께 기능 템플릿을 가지고 특이한 있다고 명시 적 (추론되지 않은) 인수. 그것은 전례가 아니지만 종종 더 나은 접근법이 있습니다.

+0

TT 감사합니다. 실제로 그들은 많은 코드를 공유 그래서 나는 정말 – WhatABeautifulWorld

+1

@WhatABeautifulWorld 그것을 복제 할 수 없습니다 : 당신은 항상 당신의 코드를 반영 할 수있는 타입에 의존하는 부분이 specializable 기능에 이관 할 수 있도록 ... –

+0

한 빠른 후속, 내가 경우 std :: is_same을 사용하면 다른 템플릿 매개 변수에 대한 코드가 느려지지 않습니다. 맞습니까? – WhatABeautifulWorld

5

당신은 다음과 같이 자신의 매개 변수에 전달 무엇을 기반으로 템플릿을 전문으로 할 수 있습니다 :이 T로 전달되는 유형을 기반으로 완전히 새로운 기능을 생성하는

template <> void foo<animal> { 

} 

참고. 이는 일반적으로 혼란을 줄이고 본질적으로 우리가 처음부터 템플릿을 가지고있는 이유 때문에 바람직합니다.

+0

흠. 이 방법이 실제로 템플릿 인수를 전문화하는 유일한 방법입니까? 템플릿 함수 내에서 관리해야하는 10 가지 하위 클래스가 있다고 가정 해 보겠습니다. 각각의 클래스에 대해 10 가지 템플릿 함수를 작성해야합니까? 여기 핵심 포인트를 놓치고있는 것 같습니다. –

3

나는 오늘날,하지만 C++ (17)와 함께 사용하는 것이 좋습니다 생각합니다. 당신이 constexpr없는 경우 표현의 몸에 어떤 종류의 특정 작업을 사용하는 경우

#include <type_traits> 

template <typename T> 
void foo() { 
    if constexpr (std::is_same_v<T, animal>) { 
     // use type specific operations... 
    } 
} 

이 코드는 컴파일되지 않습니다.

+1

:: is_same :: 당신이 짧은 사용할 수있는 값 ':'표준 : is_same_v ' – Fureeish

+0

네의 is_same_v을, 감사 –

관련 문제