logo

예제가 포함된 C++ 템플릿

주형 C++의 간단하면서도 매우 강력한 도구입니다. 간단한 아이디어는 데이터 유형을 매개변수로 전달하여 서로 다른 데이터 유형에 대해 동일한 코드를 작성할 필요가 없도록 하는 것입니다. 예를 들어, 소프트웨어 회사에서는 다양한 데이터 유형에 대해 sort()를 수행해야 할 수 있습니다. 여러 코드를 작성하고 유지하는 대신 하나의 sort()를 작성하고 데이터 유형을 매개변수로 전달할 수 있습니다.

C++에서는 템플릿을 지원하기 위해 두 가지 새로운 키워드를 추가합니다. '주형' 그리고 '유형 이름' . 두 번째 키워드는 항상 키워드로 대체될 수 있습니다. '수업' .



템플릿은 어떻게 작동하나요?

템플릿은 컴파일러 타임에 확장됩니다. 이것은 매크로와 같습니다. 차이점은 컴파일러가 템플릿 확장 전에 유형 검사를 수행한다는 것입니다. 아이디어는 간단합니다. 소스 코드에는 함수/클래스만 포함되어 있지만 컴파일된 코드에는 동일한 함수/클래스의 여러 복사본이 포함될 수 있습니다.

템플릿-cpp

기능 템플릿

우리는 다양한 데이터 유형에 사용할 수 있는 일반 함수를 작성합니다. 함수 템플릿의 예로는 sort(), max(), min(), printArray()가 있습니다.

주제에 대해 더 자세히 알고 싶으면 다음을 참조하세요. C++의 제네릭 .



예:

C++
// C++ Program to demonstrate // Use of template #include  using namespace std; // One function works for all data types. This would work // even for user defined types if operator '>'이(가) 오버로드된 템플릿입니다.T myMax(T x, T y) { return (x> y) ? x : y; } int main() { // int cout을 위해 myMax를 호출합니다.<< myMax (3, 7)<< endl;  // call myMax for double  cout << myMax(3.0, 7.0)<< endl;  // call myMax for char  cout << myMax('g', 'e')<< endl;  return 0; }>

산출
7 7 g>

예: 구현 버블정렬 C++에서 템플릿 사용

오라클 SQL이 같지 않습니다
C++
// C++ Program to implement // Bubble sort // using template function #include  using namespace std; // A template function to implement bubble sort. // We can use this for any data type that supports // comparison operator  template void bubbleSort(T a[], int n) { for (int i = 0; i< n - 1; i++)  for (int j = n - 1; i < j; j--)  if (a[j] < a[j - 1])  swap(a[j], a[j - 1]); } // Driver Code int main() {  int a[5] = { 10, 50, 30, 40, 20 };  int n = sizeof(a) / sizeof(a[0]);  // calls template function  bubbleSort (a, n);  시합<< ' Sorted array : ';  for (int i = 0; i < n; i++)  cout << a[i] << ' ';  cout << endl;  return 0; }>

산출
 Sorted array : 10 20 30 40 50>

클래스 템플릿

함수 템플릿, 클래스 템플릿과 같은 클래스 템플릿은 클래스가 데이터 유형과 독립적인 것을 정의할 때 유용합니다. LinkedList, BinaryTree, Stack, Queue, Array 등과 같은 클래스에 유용할 수 있습니다.



예:

C++
// C++ Program to implement // template Array class #include  using namespace std; template 클래스 배열 { 개인: T* ptr;  정수 크기; 공개: 배열(T arr[], int s);  무효 인쇄(); }; 주형정렬::Array(T arr[], int s) { ptr = new T[s];  크기 = s;  for (int i = 0; i< size; i++)  ptr[i] = arr[i]; } template 보이드 어레이::print() { for (int i = 0; i< size; i++)  cout << ' ' << *(ptr + i);  cout << endl; } int main() {  int arr[5] = { 1, 2, 3, 4, 5 };  Array a(arr, 5);  a.print();  0을 반환합니다. }>

산출
 1 2 3 4 5>

템플릿에 대한 인수가 두 개 이상 있을 수 있나요?

예, 일반 매개변수와 마찬가지로 둘 이상의 데이터 유형을 템플릿에 대한 인수로 전달할 수 있습니다. 다음 예제에서는 동일한 내용을 보여줍니다.

예:

C++
// C++ Program to implement // Use of template #include  using namespace std; template 클래스 A { T x;  유 y; 공개: A() { cout<< 'Constructor Called' << endl; } }; int main() {  Aㅏ;  ㅏ 비;  0을 반환합니다. }>

산출
Constructor Called Constructor Called>

템플릿 인수의 기본값을 지정할 수 있나요?

예, 일반 매개변수와 마찬가지로 템플릿에 기본 인수를 지정할 수 있습니다. 다음 예제에서는 동일한 내용을 보여줍니다.

예:

C++
// C++ Program to implement // Use of template #include  using namespace std; template 클래스 A { 공개: T x;  유 y;  A() {cout<< 'Constructor Called' << endl; } }; int main() {  // This will call A  Aㅏ;  0을 반환합니다. }>

산출
Constructor Called>

함수 오버로딩과 템플릿의 차이점은 무엇입니까?

함수 오버로딩과 템플릿 모두 OOP의 다형성 기능의 예입니다. 함수 오버로딩은 여러 함수가 매우 유사한(동일하지 않은) 작업을 수행할 때 사용되며, 템플릿은 여러 함수가 동일한 작업을 수행할 때 사용됩니다.

템플릿 클래스/함수에 정적 멤버가 있으면 어떻게 되나요?

템플릿의 각 인스턴스에는 자체 정적 변수가 포함되어 있습니다. 보다 템플릿 및 정적 변수 상세 사항은.

템플릿 전문화란 무엇입니까?

템플릿 전문화를 통해 특정 데이터 유형에 대해 서로 다른 코드를 가질 수 있습니다. 보다 템플릿 전문화 상세 사항은.

씨#

유형이 아닌 매개변수를 템플릿에 전달할 수 있나요?

유형이 아닌 인수를 템플릿에 전달할 수 있습니다. 비유형 매개변수는 주로 템플릿의 특정 인스턴스에 대한 최대값, 최소값 또는 기타 상수 값을 지정하는 데 사용됩니다. 비유형 매개변수에 대해 주의해야 할 중요한 점은 매개변수가 const여야 한다는 것입니다. 컴파일러는 컴파일 타임에 비형식 매개변수의 값을 알아야 합니다. 컴파일러는 컴파일 타임에 지정된 비유형 값에 대한 함수/클래스를 생성해야 하기 때문입니다. 아래 프로그램에서 10000 또는 25를 변수로 바꾸면 컴파일러 오류가 발생합니다.

예:

C++
// C++ program to demonstrate // working of non-type parameters // to templates in C++ #include  using namespace std; template int arrMin(T arr[], int n) { int m = 최대;  for (int i = 0; i< n; i++)  if (arr[i] < m)  m = arr[i];  return m; } int main() {  int arr1[] = { 10, 20, 15, 12 };  int n1 = sizeof(arr1) / sizeof(arr1[0]);  char arr2[] = { 1, 2, 3 };  int n2 = sizeof(arr2) / sizeof(arr2[0]);  // Second template parameter  // to arrMin must be a  // constant  cout << arrMin (arr1, n1)<< endl;  cout << arrMin(arr2, n2);    0을 반환합니다. }>

산출
10 1>

다음은 생성자와 템플릿을 사용하여 다양한 데이터 유형을 표시하는 C++ 프로그램의 예입니다. 몇 가지 작업을 수행하겠습니다.

  • main() 함수에서 객체를 생성하여 문자 값을 전달합니다.
  • main() 함수에서 객체를 생성하여 정수 값을 전달합니다.
  • main() 함수에서 객체를 생성하여 float 값을 전달합니다.

예:

C++
// C++ program to show different data types using a // constructor and template. #include  using namespace std; // defining a class template template class info { public: // 유형 템플릿의 생성자 info(T A) { cout<< '
'  << 'A = ' << A  << ' size of data in bytes:' << sizeof(A);  }  // end of info() }; // end of class // Main Function int main() {  // clrscr();  // passing character value by creating an objects  infop('x');  // 객체 정보를 생성하여 정수 값을 전달합니다. q(22);  // 객체 정보를 생성하여 부동 소수점 값을 전달합니다.r(2.25);  0을 반환합니다. }>

산출
A = x size of data in bytes:1 A = 22 size of data in bytes:4 A = 2.25 size of data in bytes:4>

템플릿 인수 추론

템플릿 인수 추론은 클래스 또는 함수 템플릿에 전달된 인수의 데이터 유형을 자동으로 추론합니다. 이를 통해 데이터 유형을 명시적으로 지정하지 않고도 템플릿을 인스턴스화할 수 있습니다.

Java에서 int를 문자열로

예를 들어, 두 숫자를 곱하는 아래 함수 템플릿을 고려해 보세요.

template  t multiply (t num1,t num2) { return num1*num2; }>

일반적으로 정수에 Multiply() 함수를 사용하려면 다음과 같이 호출해야 합니다.

multiply (25, 5);>

그러나 우리는 그것을 다음과 같이 부를 수도 있습니다.

multiply(23, 5);>

유형을 명시적으로 지정하지 않습니다. 즉, 1,3은 정수입니다.

템플릿 클래스의 경우에도 마찬가지입니다(C++17부터). 템플릿 클래스를 다음과 같이 정의한다고 가정합니다.

template class student{  private:  t total_marks;  public:  student(t x) : total_marks(x) {} };>

이 클래스의 인스턴스를 생성하려면 다음 구문 중 하나를 사용할 수 있습니다.

student stu1(23);    or  student stu2(24);>

메모: 클래스에 대한 템플릿 인수 추론은 C++17부터만 사용할 수 있으므로 이전 버전에서 클래스에 대한 자동 템플릿 인수 추론을 사용하려고 하면 오류가 발생한다는 점에 유의하는 것이 중요합니다.

템플릿 인수 추론의 예

아래 예는 STL 벡터 클래스 템플릿이 명시적으로 지정되지 않고 데이터 유형을 추론하는 방법을 보여줍니다.

C++
// C++ Program to illustrate template arguments deduction in // STL #include  #include  using namespace std; int main() {  // creating a vector object without specifying  // type  vector v1{ 1.1, 2.0, 3.9, 4.909 };  cout << 'Elements of v1 : ';  for (auto i : v1) {  cout << i << ' ';  }  // creating a vector object without specifying type  vector v2{ 1, 2, 3, 4 };  cout << endl << 'Elements of v2 : ';  for (auto i : v2) {  cout << i << ' ';  } }>


산출

Elements of v1 : 1.1 2 3.9 4.909  Elements of v2 : 1 2 3 4>

메모: 위 프로그램은 C++17에 클래스 템플릿 인수 추론이 추가되었으므로 C++14 이하 컴파일러에서는 컴파일에 실패합니다.

함수 템플릿 인수 추론

함수 템플릿 인수 추론은 C++98 표준 이후 C++의 일부였습니다. 함수 템플릿에 전달하려는 인수 유형 선언을 건너뛸 수 있으며 컴파일러는 함수 호출에 전달한 인수를 사용하여 자동으로 유형을 추론합니다.

안드로이드의 이스터 에그가 뭐야?

예: 다음 예제에서는 C++의 함수가 자동으로 해당 유형을 스스로 추론하는 방법을 보여줍니다.

C++
// C++ program to illustrate the function template argument // deduction #include  using namespace std; // defining function template template t 곱셈(t 먼저, t 두 번째) { 첫 번째 * 두 번째 반환; } // 드라이버 코드 int main() { 자동 결과 = 곱셈(10, 20);  표준::cout<< 'Multiplication OF 10 and 20: ' << result  << std::endl;  return 0; }>

산출
Multiplication OF 10 and 20: 200>

메모: template void function(t a1, t a2){}와 같이 인수에 대해 동일한 유형을 갖는 함수 템플릿의 경우 다른 유형의 인수를 전달할 수 없습니다.

클래스 템플릿 인수 추론(C++17 이상)

클래스 템플릿 인수 추론은 C++17에 추가되었으며 이후 언어의 일부가 되었습니다. 이를 통해 함수 템플릿과 마찬가지로 유형을 명시적으로 정의하지 않고도 클래스 템플릿 인스턴스를 생성할 수 있습니다.

김프에서 어떻게 선택을 취소하나요?

예: 다음 예제에서는 컴파일러가 C++에서 템플릿을 자동으로 클래스화하는 방법을 보여줍니다.

C++
// C++ Program to implement Class Template Arguments // Deduction #include  #include  #include  using namespace std; // Defining class template template 클래스 학생 { 개인: 문자열 학생_이름;  T total_marks; public: // 매개변수화된 생성자 Student(string n, T m) : Student_name(n) , total_marks(m) { } void getinfo() { // 학생 cout의 세부 정보 인쇄<< 'STUDENT NAME: ' << student_name << endl;  cout << 'TOTAL MARKS: ' << total_marks << endl;  cout << 'Type ID: ' << typeid(total_marks).name()  << endl;  } }; int main() {  student s1('Vipul', 100); // Deduces student  student s2('Yash', 98.5); // Deduces student  s1.getinfo();  s2.getinfo();  return 0; }>


산출

STUDENT NAME: Vipul TOTAL MARKS: 100 Type ID: i STUDENT NAME: Yash TOTAL MARKS: 98.5 Type ID: d>

여기서 i는 int, d는 double을 의미한다.

템플릿 메타프로그래밍의 경우 r 다음 기사를 참조하십시오 - 템플릿 메타프로그래밍 .

받아 템플릿에 대한 퀴즈 . Java도 이러한 기능을 지원합니다. 자바는 그것을 호출 제네릭 .