함수 서명에서 std::enable_if를 피하려고 노력하는 이유는 무엇입니까?
C의 다용도 도구인 std::enable_if를 활용할 수 있습니다. 지정된 기준에 따라 함수나 클래스를 조건부로 정의하는 다양한 방법이 있습니다. 그러나 Scott Meyers는 함수 시그니처에 이를 사용하는 것에 대해 경고했습니다. 이 권장 사항을 이해하려면 std::enable_if와 함께 사용할 수 있는 다양한 전략과 그 의미를 탐색해야 합니다.
구현 옵션:
<code class="cpp">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; } };</code>
<code class="cpp">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; } };</code>
<code class="cpp">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; } };</code>
선호 접근 방식:
가장 유리한 접근 방식은 템플릿 매개변수에 활성화_if를 배치하는 것입니다. 이 기술은 명확성과 다양성 측면에서 이점을 제공합니다.
명확성:
enable_if 절은 반환 및 인수 유형과 별도로 유지될 수 있으므로 코드를 더 읽기 쉽게 만들 수 있습니다. 복잡함을 줄이기 위해 별칭 템플릿을 사용하더라도 다른 접근 방식의 병합된 절은 여전히 별도의 고유한 개념을 결합합니다.
다용성:
이 기술은 보편적으로 사용될 수 있습니다. 반환 유형이 없는 생성자와 추가 인수를 금지하는 연산자를 포함하여 다양한 컨텍스트에 적용됩니다. std::enable_if의 조건부 동작 뒤에 있는 핵심인 SFINAE는 템플릿에만 적용 가능하며 이 접근 방식의 보편성을 더욱 지원합니다.
반환 유형에서 std::enable_if 방지:
반환 유형에 std::enable_if를 사용할 때 문제는 함수 서명이 아니라 템플릿에 있습니다. 전문화. Meyers는 명확성과 일관성을 이유로 이러한 관행을 권장하지 않습니다. 활성화_if를 사용하여 반환 유형을 지정하면 템플릿 정의와 기본 템플릿 간에 불일치가 발생합니다.
<code class="cpp">template<typename T> struct Check4 { typename std::enable_if<std::is_same<T, int>::value, int>::type read() { return 42; } int read() { // error: redeclared without 'typename' return 3.14; // never used } };</code>
멤버 및 비멤버 함수 템플릿:
논의된 우려 사항 및 권장 사항 멤버 및 비멤버 기능 템플릿 모두에 적용됩니다. 접근 방식에는 눈에 띄는 차이가 없습니다.
위 내용은 함수 반환 유형에 `std::enable_if` 사용을 피해야 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!