템플릿 전문화 및 템플릿 분리 작업

1. 템플릿 전문화.

(1) 기능 템플릿의 전문화:

함수 템플릿의 전문화 단계:

  1. 먼저 기본 기능 템플릿이 있어야 합니다.
  2. 키워드 템플릿 뒤에는 빈 꺾쇠 괄호 <>가 옵니다.
  3. 함수 이름 뒤에는 특수화할 유형을 지정하는 한 쌍의 꺾쇠 괄호가 옵니다.
  4. 함수 매개변수 목록: 템플릿 함수의 기본 매개변수 유형과 정확히 동일해야 하며, 다를 경우 컴파일러에서 오류를 보고할 수 있습니다.
#include<iostream>
#include<sring.h>
using namespace std;

template<class T>// 函数模板
bool IsEqual(T& left, T& right)
{
    
    
	return left == right;
}

template<>  // 模板特化
bool IsEqual<char*>(char*& left, char*& right)
{
    
    
	if (strcmp(left, right) > 0)
		return true;
	return false;
}
int main()
{
    
    
	char* p1 = "hello";
	char* p2 = "world";
	if (p1 == p2)
		cout << p1 << endl;
	else
		cout << p2 << endl;
	return 0;
}
(2) 클래스 템플릿의 전문화:
1. 모든 전문:
  • 전체 전문화는 템플릿 매개변수 클래스 테이블의 모든 매개변수를 결정하는 것입니다.
    예를 들면 다음과 같습니다.
template < class T1, class T2>//类模板
class Date
{
    
    
public:
	Date()
	{
    
    
		cout << "Date::Date()" << endl;
	}
private:
	T1 _a;
	T2 _b;
};

template<> //全特化
class Date<int , char>
{
    
    
public:
	Date()
	{
    
    
		cout << "Date<int,char>::Date()" << endl;
	}
private:
	int _a;
	char _b;
};
2. 부분적 전문화:
  • 템플릿 매개변수의 디자인을 더욱 제한하는 특수 버전
template<class T1, class T2>
class Data
{
    
    
public:
	Data() {
    
     cout << "Data<T1, T2>" << endl; }
private:
	T1 _d1;
	T2 _d2;
};

template <class T1>
class Data<T1, int>
{
    
    
public:
	Data() {
    
     cout << "Data<T1, int>" << endl; }
private:
	T1 _d1;
	int _d2;
};

template <typename T1, typename T2>
class Data <T1*, T2*>
{
    
    
public:
	Data() {
    
     cout << "Data<T1*, T2*>" << endl; }
private:
	T1 _d1;
	T2 _d2;
};

int main()
{
    
    
	Data<int, int> d1;
	Data<int, double> d2;
	Data<int*, char*> d3;
	return 0;
}

2. 템플릿 별도 컴파일: (C++ 컴파일러에서는 지원되지 않음)

1. 분리 컴파일 : 하나의 프로그램(프로젝트)이 여러 개의 소스 파일로 구현되고, 각 소스 파일을 별도로 컴파일하여 타겟 파일을 생성하고, 마지막으로 모든 타겟 파일을 링크하여 하나의 실행 파일로 만드는 과정을 분리 컴파일 모드라고 합니다. .
2. .h 파일에 템플릿 함수를 정의하고 .cpp로 컴파일하면 오류가 발생합니다.
3. 오류 원인 분석 :
①C/C++는 프로그램 실행 시 전처리 -> 컴파일 -> 어셈블리 -> 링크의 4단계를 거쳐야 합니다.
②컴파일러가 .cpp 파일에서 함수 템플릿의 인스턴스화를 찾지 못해 함수의 특정 내용을 구현하지 못하고 오류가 발생했습니다.
4. 해결책:
① 선언과 정의를 "xxx.hpp" 또는 "xxx.h" 파일에 넣는 것도 가능합니다.
② 템플릿에 정의된 위치에서 명시적 인스턴스화 (명시적 인스턴스화).

3. 템플릿의 장점과 단점:

  • 【이점】
  1. 템플릿은 코드를 재사용하고 리소스를 절약하며 더 빠른 반복 개발을 가능하게 합니다.
  2. 향상된 코드 유연성
  • 【결함】
  1. 템플릿으로 인해 코드가 팽창하고 컴파일 시간이 길어질 수 있습니다.
  2. 템플릿 컴파일 오류가 발생하면 오류 메시지가 매우 지저분하고 오류 위치를 찾기가 어렵습니다.

Supongo que te gusta

Origin blog.csdn.net/weixin_42357849/article/details/107776288
Recomendado
Clasificación