> 백엔드 개발 > C++ > 컨테이너를 사용하지 않고 Variadic 함수 또는 템플릿에 대해 단일 인수 유형을 적용하는 방법은 무엇입니까?

컨테이너를 사용하지 않고 Variadic 함수 또는 템플릿에 대해 단일 인수 유형을 적용하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-12 00:11:03
원래의
905명이 탐색했습니다.

How to Enforce a Single Argument Type for Variadic Functions or Templates Without Using Containers?

컨테이너 없이 가변 함수 또는 템플릿에 대한 단일 인수 유형 지정

가변 함수 또는 템플릿 함수로 작업할 때 다음이 바람직할 수 있습니다. 모든 인수가 특정 유형을 준수하는지 확인하고 잘못된 사용 시 명확한 컴파일 시간 오류를 표시합니다.

가변 함수

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿