> 백엔드 개발 > C++ > C의 템플릿 유형을 특정 상속이나 기능으로 제한하려면 어떻게 해야 합니까?

C의 템플릿 유형을 특정 상속이나 기능으로 제한하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-12-31 04:58:09
원래의
181명이 탐색했습니다.

How Can I Restrict Template Types in C   to Specific Inheritance or Functionality?

C에서 특정 유형만 허용하도록 템플릿을 제한하는 방법

Java에서는 상속받은 유형만 허용하도록 일반 클래스를 정의할 수 있습니다. 특정 클래스에서:

public class ObservableList<T extends List> {
    /* ... */
}
로그인 후 복사

이것은 확장을 사용하여 달성됩니다. 키워드.

C와 동일

Java와 달리 C에는 템플릿을 제한하기 위한 확장 키워드와 직접적으로 동일한 키워드가 없습니다. 그러나 C 11의 std::is_base_of 유형 특성을 사용하여 유사한 제약 조건을 달성할 수 있는 방법이 있습니다.

#include <type_traits>

template<typename T>
class observable_list {
    static_assert(std::is_base_of<list, T>::value, "T must inherit from list");
    // code here..
};
로그인 후 복사

대체 접근 방식

이 접근 방식이 작동하는 동안, 이는 일반적인 C 디자인 원칙에서 벗어났습니다. 대신 특성 기반 제약 조건을 사용하는 것이 더 적절할 수 있습니다.

#include <type_traits>

template<typename T>
class observable_list {
    static_assert(has_const_iterator<T>::value, "Must have a const_iterator typedef");
    static_assert(has_begin_end<T>::value, "Must have begin and end member functions");
    // code here...
};

template<typename T>
struct has_const_iterator : std::false_type {};

template<typename T>
struct has_const_iterator<T, Void<typename T::const_iterator>> : std::true_type {};

struct has_begin_end_impl {
    template<typename T, typename Begin = decltype(std::declval<const T&>().begin()),
                         typename End   = decltype(std::declval<const T&>().end())>
    static std::true_type test(int);
    template<typename... Args>
    static std::false_type test(...);
};

template<typename T>
struct has_begin_end : decltype(has_begin_end_impl::test<T>(0)) {};

using Void = typename void_<>::type;

template<typename... Args>
struct void_ {
    using type = void;
};
로그인 후 복사

이 접근 방식은 특정 요구 사항(예: const_iterator, 시작 및 종료 함수의 존재)을 확인하기 위해 사용자 지정 특성을 정의합니다. 이는 더 많은 유연성을 제공하고 사용자 정의 오류 메시지를 허용합니다.

위 내용은 C의 템플릿 유형을 특정 상속이나 기능으로 제한하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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