2014-12-28 3 views
1

채워에서 사용자를 방지 :표준 : enable_if 및 템플릿 별칭, 내가 지금처럼 템플릿 별칭을 사용하고 표준 : enable_if 매개 변수

template <typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type> 
using vec2 = std::pair<T, T>; 

template <typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type> 
using vec3 = std::tuple<T, T, T>; 

문제는 사람이 vec2<int, any_type>를 수행하여이를 파괴 할 수있다. 어떻게 이것을 막을 수 있습니까?

+0

implemenetation 세부 정보가 공개되어서는 안됩니다 ... 숨기세요! –

+2

머피 (Murphy), 마키아 벨리 (Machiavelli) 등 누구나 SFINAE 마법이 얼마나 똑똑 하든지 누구나'std :: pair '으로 이것을 뒤집을 수 있습니다. –

+0

위의 주석 추가'//두 번째 템플릿 매개 변수를 수동으로 지정하지 마십시오; 그 일을 망칠거야. " – Sneftel

답변

2

도우미 별칭을 사용할 수 있습니다.

template <typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type> 
using vec2_impl = std::pair<T, T>; 

template <typename T> 
using vec2 = vec2_impl<T>; 

이제 이름 vec2std::pair<int, int> 유형을 생산하기 위해 어떤 방식으로 사용할 수 없습니다.

아마도 당신이, 그것은 수도에 사용하려는 작업에 vec2_impl<int, void>를 작성하지만, 따라가 코멘트에 언급 한 바와 같이,이 직접 std::pair<int, int>를 사용하여 가능, 해당 유형의 몇 가지 다른 방법을 사용하지 못하도록하지 않습니다 말했다

충분 해. 당신이 어떤 추가 작업을 수행 할 필요가 없습니다

template <typename T> void f(vec2<T>); 

:과 같이 또한

, 템플릿 기능을 사용하는 경우가 선언 된 발신자는 이미 어떤 std::pair<int, int> 또는 vec2<int, void> 유형을 전달하는 전혀 방법이있다 . Tint으로 추측 될 수 있지만 다음 하위 조건은 도우미 별칭을 사용하지 않아도 이미 실패합니다.

관련 문제