C ++ 템플릿 파트 에세이 (3) 템플릿 매개 변수

기본 템플릿 인수

함수에 대한 기본 인수를 제공하는 것처럼 템플릿에 대한 기본 인수도 제공 할 수 있습니다. 새 표준에서는 함수 및 클래스 템플릿에 대한 기본 인수를 제공 할 수 있습니다. 이전 C ++ 표준에서는 클래스 템플릿에 실제 매개 변수 만 제공 할 수있었습니다.

기본적으로 비교를 다시 작성하고 표준 라이브러리의 less 함수 개체 템플릿을 사용합니다.

template <typename T,typename F = int>
int compare(const T &v1, const T &v2,F a)
{
    printf("%d\n",a);
}

int main()
{
    compare(1,2,3);
    return 0;
}

그래서 우리는 F에 대한 기본 템플릿 유형 int를 설정했습니다.

기본 클래스를 설정하고 시도해 보겠습니다.

#include <memory>
#include <cstring>
#include <vector>

#include <iostream>
//#include "template.h"

class A{
public:
    int a;
    A(){
        this->a = 3;
        std::cout<<"__construct"<<std::endl;
    }
    ~A()
    {
        std::cout<<"__destruct"<<std::endl;
    }
};

template <typename T,typename F = A>
int compare(const T &v1, const T &v2,F a)
{
    printf("%d\n",a.a);
}

int main()
{
    A data;
    compare(1,2,data);
    return 0;
}

16.1.4 멤버 템플릿

클래스에는 템플릿 자체 인 멤버 함수가 포함될 수 있으며 이러한 멤버를 멤버 템플릿이라고합니다. 멤버 템플릿은 가상 기능이 될 수 없습니다.

일반 (비 템플릿 클래스의 멤버 템플릿)

멤버 템플릿을 포함하는 일반 클래스의 예로, 기본 deleter 유형을 사용하여 unique_ptr과 유사한 클래스를 정의합니다. 클래스에는 포인터를 수신하고이 포인터에서 삭제를 실행하는 오버로드 된 함수 호출 연산자가 포함됩니다. 기본 삭제 자와 달리 우리 클래스는 삭제가 실행될 때 메시지를 인쇄합니다. deleter가 모든 유형에 적용되기를 원하므로 call 연산자를 템플릿으로 정의합니다.

#include <memory>
#include <cstring>
#include <vector>

#include <iostream>
//#include "template.h"

class A{

};

class DebugDelete{
public:
    DebugDelete(std::ostream &s = std::cerr):os(s){

    }

    template <typename T> void operator()(T *p) const
    {
        os << "deleteing unique_ptr"<<std::endl;
    }

private:
    std::ostream &os;
};


int main()
{
    std::shared_ptr<A> data = std::make_shared<A>();
    int* a = new int(3);
    DebugDelete() (&data);
    return 0;
}

클래스 템플릿의 멤버 템플릿

클래스 템플릿에 대한 멤버 템플릿을 정의 할 수도 있습니다. 이 경우 클래스와 멤버에는 각각 고유 한 템플릿 매개 변수가 있습니다.

클래스 템플릿의 일반 함수와 달리 멤버 템플릿은 함수 템플릿입니다. 클래스 템플릿 외부에서 멤버 템플릿을 정의 할 때 클래스 템플릿과 멤버 템플릿 모두에 대한 매개 변수 목록을 제공해야합니다. 클래스 템플릿의 매개 변수 목록이 먼저 나오고 그 다음에 멤버의 템플릿 매개 변수 목록이 나옵니다.

//
// Created by root on 20-2-27.
//

#ifndef TEST_TEMPLATE_H
#define TEST_TEMPLATE_H
#include <vector>
#include <iostream>
// Created by root on 20-2-27.
//

template <typename T>class A{
public:
    template <typename It>
    A(It b,It e);
};

template <typename T>
template <typename It>
A<T>::A(It b,It e)
{

}

#endif //TEST_TEMPLATE_H

앞서 언급했듯이 파일에 정의되어야합니다.

추천

출처blog.csdn.net/qq_32783703/article/details/104715140