>  기사  >  백엔드 개발  >  추가 데이터 구조를 사용하지 않고 가변 함수 또는 템플릿 함수에 전달된 모든 인수가 동일한 유형인지 어떻게 확인할 수 있습니까?

추가 데이터 구조를 사용하지 않고 가변 함수 또는 템플릿 함수에 전달된 모든 인수가 동일한 유형인지 어떻게 확인할 수 있습니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-10 19:33:03859검색

How can you ensure that all arguments passed to a variadic function or template function are of the same type without using additional data structures?

가변 인수에 대한 한 가지 유형 지정

이 문서에서는 가변 함수 또는 가변 템플릿 함수에 전달된 모든 인수가 올바른지 확인하는 방법을 탐색합니다. 배열, 벡터 등의 추가 데이터 구조를 사용하지 않고 동일한 유형의 structs.

가변 함수 및 템플릿 함수

가변 함수 및 가변 템플릿 함수를 사용하면 함수가 알 수 없는 개수의 인수를 허용할 수 있습니다. 그러나 인수에 대해 어떠한 유형 제약도 적용하지 않습니다.

유형 안전성 강화

모든 인수가 동일한 유형임을 보장하기 위해 다음을 수행할 수 있습니다. 단계:

  1. Variadic 템플릿으로 인수 수락: 함수 정의 또는 템플릿 함수를 사용하여 가변 템플릿 매개변수에 의한 인수를 허용합니다.
  2. 변환성 확인을 위해 SFINAE 사용: 함수 인터페이스에서 SFINAE(대체 실패는 오류가 아님) 기술을 사용하여 인수는 특정 유형으로 변환될 수 있습니다. 이 기술을 사용하면 유효하지 않은 인수를 조기에 거부할 수 있습니다.
  3. 도우미 유형 정의: 첫 번째 인수의 유형을 결정하기 위해 가변 템플릿 fst(첫 번째 유형)를 사용하여 도우미 유형을 만듭니다.
  4. 함수 서명에 SFINAE 적용: 함수 서명에 활성화_if를 적용하여 인수가 다음과 같은지 확인합니다. 원하는 유형으로 변환 가능. 검사에 실패하면 컴파일러에서 오류가 발생합니다.

예:

다음 코드는 이 기술을 구현하는 방법을 보여줍니다.

template<typename R, typename...> struct fst { typedef R type; };

template<typename ...Args>
typename fst<void, 
  typename enable_if<
    is_convertible<Args, ToType>::value
  >::type...
>::type 
f(Args...);

사용법:

이 코드 f에 전달된 모든 인수가 ToType 유형으로 변환될 수 있는지 확인합니다. 변환할 수 없는 인수가 있으면 컴파일러에서 오류가 발생합니다.

변환-나중에 접근 방식:

또는 배열에서 다음으로 변환하는 단계를 알고 있는 경우 원하는 유형을 선택하려면 다음을 사용할 수 있습니다. 접근 방식:

template<typename ...Items>
dragon_list_t make_dragon_list(Items... maidens) {
    std::array<Maiden, sizeof...(Items)> arr = {{ maidens ... }};
    // here be dragons
}

결론:

가변 템플릿 함수와 SFINAE를 활용하면 가변 인수에 유형 안전성을 적용하여 모든 인수가 동일하도록 보장할 수 있습니다. 유형. 이를 통해 추가 데이터 구조 없이 동종 데이터에 대해 작동하는 함수를 만들 수 있습니다.

위 내용은 추가 데이터 구조를 사용하지 않고 가변 함수 또는 템플릿 함수에 전달된 모든 인수가 동일한 유형인지 어떻게 확인할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.