다른 보기 유형이 있으며, 각각 std::size_t View::dimension
구성원 상수와 typename View::value_type
구성원 유형이 있습니다. From
및 To
모두 (is_view<>
하여 확인)들이다 및 From
의 내용 To
에 할당 될 수 있는지SFINAE std :: enable_if 인수
다음 컴파일 형 체크 확인한다. (동일한 차원 및 변환 가능 값 유형).
template<typename From, typename To>
struct is_compatible_view : std::integral_constant<bool,
is_view<From>::value &&
is_view<To>::value &&
From::dimension == To::dimension &&
std::is_convertible<typename From::value_type, typename To::value_type>::value
> { };
is_view<T>
는 항상 모든 종류의 T
를 들어, std::true_type
또는 std::false_type
로 평가하도록한다. 문제는 From
또는 To
이보기 유형이 아닌 경우 From::dimension
(예 :)이없고, is_compatible_view<From, To>
이 컴파일 오류를 발생시키는 것입니다. 이 경우 대신 std::false_type
으로 평가되어야합니다.
is_compatible_view
은 SFINAE에 std::enable_if
과 함께 사용되며 멤버 기능을 사용하지 않도록 설정됩니다. 예를 들어, 뷰 클래스 멤버 함수
struct View {
constexpr static std::size_t dimension = ...
using value_type = ...
template<typename Other_view>
std::enable_if_t<is_compatible_view<Other_view, View>> assign_from(const Other_view&);
void assign_from(const Not_a_view&);
};
Not_a_view
을 가질 수있는 것은 볼 수없고, is_compatible_view<Not_a_view, ...>
에서 컴파일 오류가 발생합니다. view.assign_from(Not_a_view())
을 호출하면 SFINAE가 적용되지 않고 컴파일러에서 첫 번째 assign_from
함수를 해결하려고하면 컴파일 오류가 발생합니다.
is_compatible_view
이 올바르게 작동하려면 어떻게해야합니까? C++에서는 std::conjunction<...>
이 이것을 허용합니까?
실제로 첫 번째 스 니펫에':: type'의 요점이 표시되지 않습니다.또한, 유즈 케이스에 따라'From :: value_type' 등의 에러를 즉각적인 컨텍스트로 끌어들이는'enable_if_compatible_view' 앨리어스 템플릿을 만드는 것으로 충분할 수도 있습니다. –