내가 템플릿 기능과 두 개의 클래스템플릿 매개 변수의 유형을 확인하는 방법은 무엇입니까?
T에 대한 검사가 동물 어떻게해야합니까class animal {
}
class person {
}
template<class T>
void foo() {
if (T is animal) {
kill();
}
}
있다고 가정? 나는 실행 시간 동안 확인하는 것을 갖고 싶지 않습니다. 감사합니다
내가 템플릿 기능과 두 개의 클래스템플릿 매개 변수의 유형을 확인하는 방법은 무엇입니까?
T에 대한 검사가 동물 어떻게해야합니까class animal {
}
class person {
}
template<class T>
void foo() {
if (T is animal) {
kill();
}
}
있다고 가정? 나는 실행 시간 동안 확인하는 것을 갖고 싶지 않습니다. 감사합니다
사용 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 */ }
참고 또한 함께 기능 템플릿을 가지고 특이한 있다고 명시 적 (추론되지 않은) 인수. 그것은 전례가 아니지만 종종 더 나은 접근법이 있습니다.
당신은 다음과 같이 자신의 매개 변수에 전달 무엇을 기반으로 템플릿을 전문으로 할 수 있습니다 :이 T
로 전달되는 유형을 기반으로 완전히 새로운 기능을 생성하는
template <> void foo<animal> {
}
참고. 이는 일반적으로 혼란을 줄이고 본질적으로 우리가 처음부터 템플릿을 가지고있는 이유 때문에 바람직합니다.
흠. 이 방법이 실제로 템플릿 인수를 전문화하는 유일한 방법입니까? 템플릿 함수 내에서 관리해야하는 10 가지 하위 클래스가 있다고 가정 해 보겠습니다. 각각의 클래스에 대해 10 가지 템플릿 함수를 작성해야합니까? 여기 핵심 포인트를 놓치고있는 것 같습니다. –
나는 오늘날,하지만 C++ (17)와 함께 사용하는 것이 좋습니다 생각합니다. 당신이 constexpr
없는 경우 표현의 몸에 어떤 종류의 특정 작업을 사용하는 경우
#include <type_traits>
template <typename T>
void foo() {
if constexpr (std::is_same_v<T, animal>) {
// use type specific operations...
}
}
이 코드는 컴파일되지 않습니다.
:: is_same
네의 is_same_v을, 감사 –
TT 감사합니다. 실제로 그들은 많은 코드를 공유 그래서 나는 정말 – WhatABeautifulWorld
@WhatABeautifulWorld 그것을 복제 할 수 없습니다 : 당신은 항상 당신의 코드를 반영 할 수있는 타입에 의존하는 부분이 specializable 기능에 이관 할 수 있도록 ... –
한 빠른 후속, 내가 경우 std :: is_same을 사용하면 다른 템플릿 매개 변수에 대한 코드가 느려지지 않습니다. 맞습니까? – WhatABeautifulWorld