정말 간단합니다. 클래스/구조체 템플릿 매개 변수에 기본값으로 설정된 다른 템플릿 매개 변수를 사용해야합니다.
는 두 멤버,
void foo<T>::bar1 (int)
및
int foo<T>::bar2()
와 클래스
foo<T>
을한다고 가정하고
bar1()
및
bar2()
이
T
이
long
다른 경우에만 구현되어 있음을한다고 가정.
위험이 있습니다
#include <type_traits>
template <typename T>
struct foo
{
template <typename U = T>
typename std::enable_if<false == std::is_same<U, long>::value>::type
bar1 (int)
{ }
template <typename U = T>
typename std::enable_if<false == std::is_same<U, long>::value, int>::type
bar2()
{ return 0; }
};
int main()
{
foo<int> fi;
foo<long> fl;
fi.bar1(0); // compile
fi.bar2(); // compile
// fl.bar1(0); // compilation error
// fl.bar2(); // compilation error
}
다음과 같이 할 수있다 :이 문제를 방지하려면
foo<long> fl;
fl.bar1<long long>(0);
을 다음과 같이 누군가가 당신의 통제와 노골적인 U
유형을 우회 할 수있다, 당신은 당신의 std::enable_if
을 향상시킬 수 있습니다 다음과 같이 테스트하십시오.
template <typename U = T>
typename std::enable_if
<sizeof(U) && (false == std::is_same<T, long>::value)>::type
bar1 (int)
{ }
template <typename U = T>
typename std::enable_if
<sizeof(U) && (false == std::is_same<T, long>::value), int>::type
bar2()
{ return 0; }
당신이 typename
의 커플 ::type
경우 몇 피할 수 std::enable_if_t
를 사용하여 C++ 14 컴파일러를 사용하고 내가 원하는 whant는 완벽했다
template <typename U = T>
std::enable_if_t<sizeof(U) && (false == std::is_same<T, long>::value)>
bar1 (int)
{ }
template <typename U = T>
std::enable_if_t<sizeof(U) && (false == std::is_same<T, long>::value), int>
bar2()
{ return 0; }
감사를 다음과 같이 코드를 semplify. 그러나 나는 아직도 약간의 이해가 부족하다. 'U'대신 'T'를 직접 사용할 수없는 이유는 무엇입니까?? 또한 두 번째 예제 인 sizeof (U)는 어떻게 0이 될 수 있습니까? –
Waldorf