기본 템플릿 인수
함수에 대한 기본 인수를 제공하는 것처럼 템플릿에 대한 기본 인수도 제공 할 수 있습니다. 새 표준에서는 함수 및 클래스 템플릿에 대한 기본 인수를 제공 할 수 있습니다. 이전 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
앞서 언급했듯이 파일에 정의되어야합니다.