>  기사  >  백엔드 개발  >  C 템플릿에서 멤버 함수를 부분적으로 전문화할 수 있습니까?

C 템플릿에서 멤버 함수를 부분적으로 전문화할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-06 18:26:02791검색

Can You Partially Specialize Member Functions in C   Templates?

부분 템플릿 멤버 함수 특화

C에서는 템플릿 클래스의 개별 멤버를 부분적으로 특화하는 것이 불가능합니다. 템플릿 특수화는 모든 템플릿 매개변수를 지정해야 합니다.

예를 들어 다음 코드는 유효하지 않습니다.

<code class="cpp">template <typename T>
struct X
{
    void Specialized();
};

template <typename T> // Only specializes for bool type
void X<T>::Specialized()
{
    ...
}

template <typename T> // Only specializes for float type
void X<T>::Specialized()
{
    ...
}</code>

해결 방법

여러 가지 해결 방법이 있습니다. 원하는 동작을 달성하려면:

  • 명시적 특수화:
    원하는 각 템플릿 인수 조합에 대해 전체 템플릿 클래스를 명시적으로 특수화할 수 있습니다. 예:

    <code class="cpp">template <>
    void X<int, true>::Specialized()
    {
        ...
    }
    
    template <>
    void X<float, false>::Specialized()
    {
        ...
    }</code>
  • 오버로드된 함수:
    템플릿 클래스 내에서 동일한 이름으로 오버로드된 함수를 정의하고 템플릿 인수를 사용하여 두 함수를 구별할 수 있습니다. 그들을. 예:

    <code class="cpp">template <typename T>
    struct X
    {
        void Specialized(bool b)
        {
            SpecializedImpl(i2t<b>());
        }
    
    private:
        void SpecializedImpl(i2t<true>)
        {
            ...
        }
    
        void SpecializedImpl(i2t<false>)
        {
            ...
        }
    };</code>

    오버로드된 함수에 부울 값을 전달하면 해당 특정 멤버 함수에 대한 부분 특수화를 달성할 수 있습니다.

  • 매개변수화된 템플릿 :
    템플릿 매개변수를 기반으로 원하는 동작을 구현하기 위해 별도의 템플릿 클래스를 정의할 수 있습니다. 예:

    <code class="cpp">template <typename T, bool B>
    struct SpecializedImpl
    {
        static void call()
        {
            ...
        }
    };
    
    template <typename T>
    struct X
    {
        void Specialized()
        {
            SpecializedImpl<T, B>::call();
        }
    };</code>

    SpecializedImpl 템플릿은 T와 B 모두에 의해 매개변수화되므로 해당 매개변수의 특정 값을 기반으로 특수화할 수 있습니다.

선택 사용할 해결 방법은 코드의 특정 요구 사항과 개발자의 기본 설정에 따라 다릅니다.

위 내용은 C 템플릿에서 멤버 함수를 부분적으로 전문화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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