Scott Meyers는 다음 책 EC ++ 11의 내용과 상태 를 게시 했습니다. 그는이 책의 한 항목은 " std::enable_if
기능 서명을 피하십시오 "라고 썼다 .
std::enable_if
함수 인수, 반환 형식 또는 클래스 템플릿 또는 함수 템플릿 매개 변수로 사용하여 오버로드 확인에서 함수 또는 클래스를 조건부로 제거 할 수 있습니다.
이 질문 에는 세 가지 솔루션이 모두 표시됩니다.
기능 매개 변수로 :
template<typename T>
struct Check1
{
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, int>::value >::type* = 0) { return 42; }
template<typename U = T>
U read(typename std::enable_if<
std::is_same<U, double>::value >::type* = 0) { return 3.14; }
};
템플릿 매개 변수로 :
template<typename T>
struct Check2
{
template<typename U = T, typename std::enable_if<
std::is_same<U, int>::value, int>::type = 0>
U read() { return 42; }
template<typename U = T, typename std::enable_if<
std::is_same<U, double>::value, int>::type = 0>
U read() { return 3.14; }
};
반환 유형으로 :
template<typename T>
struct Check3
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value, U>::type read() {
return 42;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, double>::value, U>::type read() {
return 3.14;
}
};
- 어떤 솔루션을 선호해야하며 다른 솔루션을 피해야합니까?
- "
std::enable_if
함수 서명을 피하십시오 " 는 반환 유형 (일반 함수 서명의 일부가 아닌 템플릿 전문화)으로 사용하는 것과 관련 이있는 경우 는 무엇입니까? - 멤버 및 비 멤버 함수 템플릿에 차이가 있습니까?
std::enable_if
내 함수 서명 (특히 추악한 추가 더럽 nullptr
항상 뭔가에 대해 (그것이 무엇인지와 같은 이상한 해킹을 보이기 때문에 함수 인수 버전) static if
힘 인터랙 팅 언어 기능을 활용하기 위해 템플릿 블랙 매직을 사용하여 훨씬 더 아름답고 깨끗하게 수행하십시오. 이것이 가능할 때마다 태그 디스 패칭을 선호하는 이유입니다 (여전히 이상한 인수가 있지만 공개 인터페이스에는 없으며 추악하고 암호가 적습니다 ).
=0
을 typename std::enable_if<std::is_same<U, int>::value, int>::type = 0
성취 하는지 묻고 싶 습니까? 나는 그것을 이해할 수있는 올바른 자료를 찾을 수 없었습니다. 전에 나는 첫 번째 부분을 알고있는 =0
회원 유형이 int
있는 경우를 U
와 int
동일합니다. 많은 감사합니다!