컨테이너 없이 가변 함수 또는 템플릿에 대한 단일 인수 유형 지정
가변 함수 또는 템플릿 함수로 작업할 때 다음이 바람직할 수 있습니다. 모든 인수가 특정 유형을 준수하는지 확인하고 잘못된 사용 시 명확한 컴파일 시간 오류를 표시합니다.
가변 함수
printf 계열과 같은 가변 함수 , 다양한 유형의 다양한 인수를 허용합니다. 그러나 유형 안전성이 부족하여 모든 인수에 대해 특정 유형을 적용하기가 어렵습니다.
가변 템플릿 함수
가변 템플릿 함수는 템플릿 유형을 통해 유형 안전성을 제공할 수 있습니다. 매개변수. 그러나 템플릿 매개변수 내에 원하는 유형의 배열이나 벡터를 지정하면 함수 서명에 불필요한 복잡성이 추가됩니다.
해결책: 템플릿 메타프로그래밍(SFINAE)
컨테이너를 사용하지 않고 유형을 적용하면 템플릿 메타프로그래밍과 SFINAE(Substitution Failure Is Not An Error) 기술을 활용할 수 있습니다. 다음은 간단한 예입니다.
template<typename ToType, typename Arg> struct is_convertible { static constexpr bool value = false; }; template<typename ToType, typename FromType> struct is_convertible<ToType, FromType> : std::is_convertible<FromType, ToType> {}; template<typename ...Args> void f(Args...) { // Check if all arguments are convertible to the desired type typename std::enable_if< is_convertible<ToType, Args>::value && ... >::type...; }
이 예에서 is_convertible 템플릿 메타 함수는 각 인수를 ToType 유형으로 변환할 수 있는지 확인합니다. 그런 다음 f 함수는 SFINAE를 사용하여 모든 인수가 이 조건을 충족하는 경우에만 사용할 수 있도록 합니다.
사용법
make_dragon_list 함수에 대한 유형 제약 조건을 적용하려면 다음을 사용할 수 있습니다. SFINAE는 다음과 같습니다.
template<typename ToType, typename ...Args> typename std::enable_if< is_convertible<ToType, Args>::value && ... >::type make_dragon_list(Args...);
이 접근 방식을 사용하면 컴파일러는 잘못된 유형의 인수를 전달하려는 시도를 거부하여 명확하고 초기 오류 메시지를 제공합니다.
위 내용은 컨테이너를 사용하지 않고 Variadic 함수 또는 템플릿에 대해 단일 인수 유형을 적용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!