English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서에서는 C ++의 템플릿. 템플릿의 기능을 사용하여 일반 프로그래밍을 배울 것입니다.
C ++의 강력한 기능은 일반 프로그램을 작성할 수 있도록 합니다. 간단히 말해서, 템플릿을 사용하여 다른 데이터 유형을 처리할 수 있는 함수나 클래스를 생성할 수 있습니다.
템플릿은 일반적으로 큰 코드 라이브러리에서 사용되며, 목적은 코드의 재사용성과 프로그램의 유연성을 실현하는 것입니다.
템플릿 개념은 두 가지 다른 방식으로 사용될 수 있습니다:
함수 템플릿
클래스 템플릿
함수 템플릿의 작동 방식은 일반함수유사하지만, 다른 점이 있습니다.
단일 함수 템플릿은 한 번에 다른 데이터 유형을 처리할 수 있지만, 단일 일반 함수는 단일 데이터 유형 집합만 처리할 수 있습니다.
일반적으로 두 가지나 더 많은 데이터 유형에 대해 동일한 작업을 수행해야 할 때, 함수 오버로드를 사용하여 필요한 함수 선언을 가진 두 가지 함수를 생성할 수 있습니다.
그러나 더 나은方法是 함수 템플릿을 사용하는 것이며, 같은 작업을 수행하기 위해 덜한 코드를 사용할 수 있습니다.
함수 템플릿은 키워드 template로 시작하며, 그 뒤에는 <>안에 템플릿 파라미터가 있고, 그 다음에는 함수 선언이 있습니다.
template <class T> T someFunction(T arg) { ... .. ... }
위의 코드에서 T는 템플릿 파라미터로, int, float 등 다양한 데이터 타입을 받을 수 있습니다. 그리고class는 키워드입니다.
위의 예제에서는 typename 키워드 대신 class를 사용할 수도 있습니다.
someFunction()에 데이터 타입의 파라미터를 전달할 때, 컴파일러는 주어진 데이터 타입에 대한 someFunction()의 새 버전을 생성합니다.
프로그램은 함수 템플릿을 사용하여 두 개의 숫자 중 가장 큰 하나를 표시합니다.
//두 개의 문자를 함수 템플릿에 전달하면 ASCII 값을 큰 문자를 표시합니다. #include <iostream> using namespace std; // 템플릿 함수 template <class T> T Large(T n1, T n2) { return (n1 > n2) ? n1 : n2; } int main() { int i1, i2; float f1, f2; char c1, c2; cout << "입력 두 개의 정수:\n"; cin >> i1 >> i2; cout << Large(i1, i2) << " 더 큰." << endl; cout << "\n두 개의 실수를 입력하세요:\n"; cin >> f1 >> f2; cout << Large(f1, f2) << " 더 큰." << endl; cout << "\n두 개의 문자를 입력하세요:\n"; cin >> c1 >> c2; cout << Large(c1, c2) << " 더 큰 ASCII 값을 가집니다."; return 0; }
출력 결과
두 개의 정수를 입력하세요: 5 10 10 is larger. 두 개의 실수를 입력하세요: 12.4 10.2 12.4 is larger. 두 개의 문자를 입력하세요: z Z z는 더 큰 ASCII 값을 가집니다.
위의 프로그램에서는 함수 템플릿 Large()를 정의했습니다. 이는 T 데이터 타입의 두 개의 파라미터 n을 받습니다1와 n2。T는 이 파라미터가 어떤 데이터 타입이든 될 수 있음을 의미합니다.
Large() 함수는 간단히조건 연산자두 파라미터 중 가장 큰 하나를 반환합니다.
main() 함수 내에서, int, float, char의 세 가지 다른 데이터 타입의 변수를 선언했습니다. 그런 다음, 변수를 일반 함수로 Large() 함수 템플릿에 전달했습니다.
런타임 중에 정수를 템플릿 함수에 전달할 때, 컴파일러는 int 파라미터를 받는 Large() 함수를 생성해야 하며 이렇게 합니다.
또한, 실수 데이터와 char 데이터를 전달할 때, 자변 데이터 타입을 알고 해당하는 Large() 함수를 생성합니다.
그렇게 하면 단 하나의 함수 템플릿만으로도 세 개의 동일한 일반 함수를 대체할 수 있으며, 코드를 더 적게 유지보수하기 쉽습니다.
프로그램은 함수 템플릿을 사용하여 데이터를 교환합니다.
#include <iostream> using namespace std; template <typename T> void Swap(T &n1, T &n2) { T temp; temp = n1; n1 = n2; n2 = temp; } int main() { int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "함수 템플릿에 데이터를 전달하기 전。\n"; cout << "i1 = " << i1 << "\ni2 = " << i2; cout << "\nf1 = " << f1 << "\nf2 = " << f2; cout << "\nc1 = " << c1 << "\nc2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "\n\n함수 템플릿에 데이터를 전달한 후。\n"; cout << "i1 = " << i1 << "\ni2 = " << i2; cout << "\nf1 = " << f1 << "\nf2 = " << f2; cout << "\nc1 = " << c1 << "\nc2 = " << c2; return 0; }
출력 결과
함수 템플릿에 데이터를 전달하기 전. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b 함수 템플릿에 데이터를 전달한 후. i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a
이 프로그램에서는 함수를 호출할 때 값을 전달하는 대신참조로호출하십시오。
Swap() 함수 템플릿은 두 파라미터를 받아 그들을 참조로 교환합니다。
함수 템플릿과 마찬가지로, 일반 클래스 연산을 위한 클래스 템플릿을 생성할 수 있습니다。
때로는 모든 클래스에 적용되는 클래스 구현이 필요하지만 사용할 데이터 타입이 다릅니다.
보통, 각 데이터 타입마다 다른 클래스를 생성하거나 클래스 내에서 다른 멤버 변수와 함수를 생성해야 합니다。
이는 매우 유사한 코드를 추가하고 유지보수가 어려워집니다。
하지만, 클래스 템플릿은 동일한 코드를 모든 데이터 타입에 재사용하기 쉽게 합니다。
template <class T> class className { ... .. ... public: T var; T someOperation(T arg); ... .. ... };
위의 선언에서 T는 템플릿 파라미터로, 사용할 데이터 타입의 대체 문자입니다。
클래스 내에서 멤버 변수 var와 멤버 함수 someOperation()는 모두 T 타입입니다。
클래스 템플릿 객체를 생성하려면 생성 시 < > 안에 데이터 타입을 정의해야 합니다。
className<dataType> classObject;
예를 들어:
className<int> classObject; className<float> classObject; className<string> classObject;
프로그램은 클래스 템플릿을 사용하여 두 수에 대한 더하기, 뺄셈, 곱셈 및 나눗셈 연산을 수행합니다
#include <iostream> using namespace std; template <class T> class Calculator { private: T num1, num2; public: Calculator(T n1, T n2) { num1 = n1; num2 = n2; } void displayResult() { cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; } T add() { return num1 + num2; } T subtract() { return num1 - num2; } T multiply() { return num1 * num2; } T divide() { return num1 / num2; } }; int main() { Calculator<int> intCalc(2, 1); Calculator<float> floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; }
출력 결과
Int 결과: Numbers는: 2 그리고 1. Addition은: 3 Subtraction은: 1 Product은: 2 Division은: 2 Float 결과: Numbers는: 2.4 그리고 1.2. Addition은: 3.6 Subtraction은: 1.2 Product은: 2.88 Division은: 2
위의 프로그램에서는 Calculator 클래스 템플릿을 선언했습니다.
이 클래스는 T 타입의 두 개의 사적인 멤버를 포함합니다: num1와 num2또한, 멤버를 초기화하는 생성자가 포함됩니다.
또한, 숫자의 덧셈, 뺄셈, 곱셈, 나눗셈을 계산하는 공용 멤버 함수가 포함되어 있으며, 이 함수는 사용자 정의 데이터 타입의 값을 반환합니다. 또한, 함수 displayResult()는 최종 결과를 화면에 출력합니다.
main() 함수에서는 데이터 타입에 대해 두 개의 Calculator 객체 intCalc와 floatCalc를 생성합니다: int와 float. 생성자를 통해 초기 값을 설정합니다.
주의하십시오. 우리는 객체를 생성할 때 <int>와 <float>를 사용합니다. 이는 컴파일러에게 클래스 생성에 사용할 데이터 타입을 알립니다.
이는 int와 float에 각각 클래스 정의를 생성한 후 이를 사용합니다.
그런 다음, displayResult()가 두 개의 객체에 모두 호출됩니다.
그런 다음, 두 개의 객체를 호출하여 displayResult()를 호출합니다. 이는 계산기 작업을 수행하고 출력을 표시합니다.