C++템 플 릿 기반 함수 템 플 릿 과 클래스 템 플 릿 인 스 턴 스 상세 설명

범용 프로 그래 밍
『8195』함 수 를 만 들 라 고 하면 두 수의 교환 에 사용 합 니 다.C 언어 에서 우 리 는 다음 과 같은 방법 을 사용 할 것 이다.

//       
void Swapi(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
//           
void Swapd(double* p1, double* p2)
{
	double tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}
 C 언어 는 함수 리 셋 을 지원 하지 않 기 때문에 서로 다른 유형의 변 수 를 교환 하 는 함수 의 함수 이름 은 같 을 수 없고 전송 형식 은 주소 전달 이 어야 하 며 값 전달 이 될 수 없습니다.
『8195』C++의 함수 재 업로드 와 인용 을 배 운 후에 우 리 는 다음 과 같은 방법 으로 두 수의 교환 을 실현 할 것 이다.

//       
void Swap(int& x, int& y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
//           
void Swap(double& x, double& y)
{
	double tmp = x;
	x = y;
	y = tmp;
}
*8195°C+의 함수 재 부팅 은 서로 다른 유형의 변 수 를 교환 하 는 함수 가 같은 함수 이름 을 가 질 수 있 고 전 참 은 참조 전 삼 을 사용 하여 코드 를 어렵 지 않 게 보이 게 합 니 다.
그러나 이 코드 는 아직도 부족 한 점 이 있 습 니 다.
*8195°1.다시 불 러 오 는 여러 함 수 는 유형 만 다 르 고 코드 의 재 활용 율 이 비교적 낮 으 며 새로운 유형 이 나타 나 면 교환 해 야 하 며 해당 하 는 재 업로드 함 수 를 새로 추가 해 야 합 니 다.
*8195°2.코드 의 유지 가능성 이 비교적 낮 습 니 다.그 중 하 나 는 과부하 함수 에 오류 가 발생 한 것 은 모든 과부하 함수 에 오류 가 발생 한 것 을 의미 할 수 있 습 니 다.
그럼 우 리 는 컴 파일 러 에 게 하나의 틀 을 알려 주 고 컴 파일 러 가 서로 다른 유형 에 따라 이 틀 을 이용 하여 해당 하 는 코드 를 생 성 할 수 있 습 니까?
 월병 을 만 드 는 틀 처럼 우 리 는 서로 다른 색깔 의 재 료 를 넣 으 면 모양 은 같 지만 색깔 이 다른 월병 을 얻 을 수 있다.
*8195°C++에 도 이러한 금 형 이 존재 할 수 있다 면 이 금 형 에 서로 다른 색깔 의 재료(유형)를 채 워 모양 은 같 지만 색깔 이 다른 월병(구체 적 인 유형의 코드 생 성)을 얻 으 면 코드 의 번 거 로 움 을 크게 줄 일 수 있 습 니 다.공교롭게도 앞 사람 이 이미 나 무 를 다 심 었 으 니,우 리 는 여기 서 더 위 를 식 히 기만 하면 된다.
일반적인 프로 그래 밍:형식 과 무관 한 유 니 버 설 코드 를 작성 하 는 것 은 코드 를 재 활용 하 는 수단 입 니 다.템 플 릿 은 일반적인 프로 그래 밍 의 기초 이다.

함수 템 플 릿
함수 템 플 릿 의 개념
*8195 함수 템 플 릿 은 함수 가족 을 대표 합 니 다.이 함수 템 플 릿 은 유형 과 상 관 없 이 사용 할 때 매개 변수 화 되 어 실제 인삼 유형 에 따라 함수 의 특정한 유형 버 전 을 만 듭 니 다.
함수 템 플 릿 형식
template
형식 함수 이름 되 돌려 주기(매개 변수 목록)
{
함수
}
예 를 들 면:

template<typename T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}
메모:type:name 은 템 플 릿 매개 변 수 를 정의 하 는 키워드 이 며,class 로 대체 할 수도 있 지만,struct 로 대체 할 수 없습니다.
함수 템 플 릿 의 원리
그럼 함수 템 플 릿 의 바 텀 원 리 는 무엇 입 니까?모두 가 알다 시 피 와트 는 증기기관 을 개량 하고 인 류 는 공업 혁명 을 시작 하여 생산력 을 해방 시 켰 다.기계 생산 에서 많은 수공 제품 을 도태 시 켰 다.그 본질은 중 복 된 일 을 기계 에 맡 겨 완성 하 는 것 이다.게 으 른 사람 이 세상 을 만든다!
마 운:세상 은 게으름뱅이 가 만 든 거 야.
게 으 름 은 게 으 른 것 이 아니 라 적 게 하려 면 게 으 른 방법 을 생각해 내야 한다.게 으 름 피 우 면 풍격 이 나 오고,게 으 름 피 우 면 경지 가 나온다.
함수 템 플 릿 은 청사진 입 니 다.그 자체 가 함수 가 아 닙 니 다.컴 파일 러 가 특정 유형의 함 수 를 만 드 는 금 형 입 니 다.그래서 템 플 릿 은 우리 가 해 야 할 반복 되 는 일 을 컴 파일 러 에 맡 기 는 것 이다.

『8195』컴 파일 러 컴 파일 단계 에서 함수 템 플 릿 의 사용 에 있어 컴 파일 러 는 들 어 오 는 실제 인삼 유형 에 따라 해당 하 는 유형의 함 수 를 추론 하여 호출 해 야 합 니 다.예 를 들 어 int 형식 으로 함수 템 플 릿 을 사용 할 때 컴 파일 러 는 실제 인삼 유형 에 대한 추론 을 통 해 T 를 int 유형 으로 확정 한 다음 에 int 유형 을 전문 적 으로 처리 하 는 코드 를 만 들 고 double 유형 에 도 마찬가지 입 니 다.
함수 템 플 릿 의 실례 화
*8195:서로 다른 유형의 매개 변수 로 템 플 릿 을 사용 할 때 템 플 릿 의 예화 라 고 합 니 다.템 플 릿 의 실례 화 는 암시 적 실례 화 와 디 스 플레이 실례 화로 나 뉜 다.
1.암시 적 실례 화:컴 파일 러 가 실제 참조 에 따라 템 플 릿 매개 변수 의 실제 유형 을 추론 하도록 한다.

#include <iostream>
using namespace std;
template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}
int main()
{
	int a = 10, b = 20;
	int c = Add(a, b); //       a b        int  
	return 0;
}
특히 주의:템 플 릿 을 사용 할 때 컴 파 일 러 는 일반적으로 형식 변환 작업 을 하지 않 습 니 다.따라서 다음 코드 는 컴 파일 을 통과 할 수 없습니다.

	int a = 10;
	double b = 1.1;
	int c = Add(a, b);
 컴 파일 기간 에 컴 파일 러 가 실제 인삼 에 따라 템 플 릿 매개 변수의 실제 유형 을 추론 할 때 실제 인삼 a 에 따라 T 를 int 로 추론 하고 실제 인삼 b 에 따라 T 를 double 로 추론 하지만 템 플 릿 매개 변수 목록 에 T 만 있 기 때문에 컴 파일 러 는 여기 서 T 를 int 로 확인 해 야 하 는 지 double 로 확인 할 수 없습니다.
 이때 우 리 는 두 가지 처리 방식 이 있 는데 첫 번 째 는 우리 가 전 참 할 때 b 를 int 유형 으로 강제 전환 하 는 것 이다.두 번 째 는 아래 에서 말 한 디 스 플레이 를 사용 하여 실례 화 하 는 것 이다.
2.실례 화 표시:함수 이름 뒤의<>에서 템 플 릿 매개 변수의 실제 유형 을 지정 합 니 다

#include <iostream>
using namespace std;
template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}
int main()
{
	int a = 10;
	double b = 1.1;
	int c = Add<int>(a, b); //            int
	return 0;
}
메모:디 스 플레이 실례 화 를 사용 할 때 들 어 오 는 매개 변수 형식 이 템 플 릿 매개 변수 형식 과 일치 하지 않 으 면 컴 파일 러 는 암시 적 형식 변환 을 시도 합 니 다.변환 에 성공 하지 못 하면 컴 파일 러 가 오 류 를 보고 합 니 다.
함수 템 플 릿 의 일치 원칙
1.비 템 플 릿 함수 가 같은 이름 의 함수 템 플 릿 과 동시에 존재 할 수 있 고 이 함수 템 플 릿 은 이 비 템 플 릿 함수 로 예화 할 수 있 습 니 다.

#include <iostream>
using namespace std;
//    int          
int Add(const int& x, const int& y)
{
	return x + y;
}
//           
template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}
int main()
{
	int a = 10, b = 20;
	int c = Add(a, b); //       ,         
	int d = Add<int>(a, b); //         Add  
	return 0;
}
2.비 템 플 릿 함수 와 같은 이름 의 함수 템 플 릿 에 대해 다른 조건 이 같 으 면 호출 할 때 비 템 플 릿 함 수 를 우선 호출 하고 이 템 플 릿 에서 인 스 턴 스 를 만 들 지 않 습 니 다.템 플 릿 이 더 잘 어 울 리 는 함 수 를 만 들 수 있다 면 템 플 릿 을 선택 하 십시오.

#include <iostream>
using namespace std;
//    int          
int Add(const int& x, const int& y)
{
	return x + y;
}
//           
template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}
int main()
{
	int a = Add(10, 20); //          ,          
	int b = Add(2, 2.2); //               ,               Add  
	return 0;
}
3.템 플 릿 함 수 는 자동 형식 변환 을 허용 하지 않 지만 일반 함 수 는 자동 형식 변환 을 할 수 있 습 니 다.

#include <iostream>
using namespace std;
template<typename T>
T Add(const T& x, const T& y)
{
	return x + y;
}
int main()
{
	int a = Add(2, 2.2); //             ,      
	return 0;
}
 템 플 릿 함수 가 자동 형식 변환 을 허용 하지 않 기 때문에 2 를 자동 으로 2.0 으로 변환 하거나 2.2 를 자동 으로 2 로 변환 하지 않 습 니 다.
클래스 템 플 릿
클래스 템 플 릿 의 정의 형식
template
class 클래스 템 플 릿 이름
{
클래스 내 구성원 성명
};
예 를 들 면:

template<class T>
class Score
{
public:
	void Print()
	{
		cout << "  :" << _Math << endl;
		cout << "  :" << _Chinese << endl;
		cout << "  :" << _English << endl;
	}
private:
	T _Math;
	T _Chinese;
	T _English;
};
메모:클래스 템 플 릿 의 구성원 함수 가 클래스 밖 에 정의 되 어 있 을 때 템 플 릿 매개 변수 목록 을 추가 해 야 합 니 다.

template<class T>
class Score
{
public:
	void Print();
private:
	T _Math;
	T _Chinese;
	T _English;
};
//              ,         
template<class T>
void Score<T>::Print()
{
	cout << "  :" << _Math << endl;
	cout << "  :" << _Chinese << endl;
	cout << "  :" << _English << endl;
}
 이외에 클래스 템 플 릿 은 분리 컴 파일 을 지원 하지 않 습 니 다.즉,xxx.h 파일 에 있 고 정 의 는 xxx.cpp 파일 에 있 습 니 다.
클래스 템 플 릿 의 실례 화
*8195 클래스 템 플 릿 의 예화 와 함수 템 플 릿 의 예화 가 다 릅 니 다.클래스 템 플 릿 의 예화 는 클래스 템 플 릿 이름 뒤에 뿌리<>를 두 고 예화 된 유형 을<>에 두 면 됩 니 다.

    //Score      ,Score<int> Score<double>      
	Score<int> s1;
	Score<double> s2;
메모:클래스 템 플 릿 이름 은 진정한 클래스 가 아니 라 실례 화 된 결과 가 진정한 클래스 입 니 다.
총결산
C++템 플 릿 기반 의 함수 템 플 릿 과 클래스 템 플 릿 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 C++함수 템 플 릿 과 클래스 템 플 릿 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 을 바 랍 니 다!

좋은 웹페이지 즐겨찾기