std::enable_if
을 C++ 11에서보다 잘 이해하려고하고 최소 예제를 작성하려고했습니다. 클래스가 A
이고 멤버 함수가 void foo()
이고 다른 클래스 템플릿의 유형 T
을 기반으로 구현합니다.
아래 코드는 원하는 결과를 제공하지만 아직 완전히 이해하지 못했습니다. V2
버전이 작동하지만 V1
이 아닌 이유는 무엇입니까? "중복"유형 인 U
이 필요한 이유는 무엇입니까?enable_if : void 멤버 함수에 대한 최소한의 예제입니다.
#include <iostream>
#include <type_traits>
template <typename T>
class A {
public:
A(T x) : a_(x) {}
// Enable this function if T == int
/* V1 */ // template < typename std::enable_if<std::is_same<T,int>::value,int>::type = 0>
/* V2 */ template <typename U=T, typename std::enable_if<std::is_same<U,int>::value,int>::type = 0>
void foo() { std::cout << "\nINT: " << a_ << "\n"; }
// Enable this function if T == double
template <typename U=T, typename std::enable_if<std::is_same<U,double>::value,int>::type = 0>
void foo() { std::cout << "\nDOUBLE: " << a_ << "\n"; }
private:
T a_;
};
int main() {
A<int> aInt(1); aInt.foo();
A<double> aDouble(3.14); aDouble.foo();
return 0;
}
원하는 결과를 달성하기위한 더 나은 방법이, 즉 클래스 템플릿 파라미터에 기초 void foo()
기능을 갖는 다른 구현에 대한?
당신의 예제는'enable_if'를 적절하게 사용하지 않습니다. 간단한 오버로드로 문제가 해결됩니다. 'enable_if'는 주로 * 추론 된 * 템플릿 매개 변수에 유용합니다. –
'std :: enable_if '를 사용하면 추론 된 * 부동 소수점 유형을, 예를 들어, * integral * 유형에서 분리하는 데 적합합니다. 이 두 가지 유형은 오버로드에 더 적합합니다 *. – WhozCraig
@KerrekSB @WhozCraig이 특별한 경우 어떻게하면 과부하가 걸릴까요? 클래스 외 정의'void A :: foo() {}'와'void A :: foo() {}'를 사용하면? 내 의도는 최종 코드는 필요한 함수의 버전만을 포함한다는 것입니다 (즉, 함수가 호출되지 않는다면'A :: foo()'는 사용되지 않습니다) –
untergam