C++ 템플릿
18860 단어 codenewbiecppbeginners
클래스 템플릿이란 무엇입니까?
클래스 템플릿은 일반 생성자, 메서드, 소멸자 등을 사용하여 일종의 특수 클래스를 만들 수 있는 청사진이라고 할 수 있습니다.
Student
클래스가 있습니다.class Student{
private:
std::string temp;
int data;
public:
Student(std::string t, int d){
temp = t;
data = d;
}
int getdata(){
return data;
}
std::string getstring(){
return temp;
}
};
그리고 우리는 이것과 비슷하지만 데이터 멤버로서
string
과 double
을 가진 다른 클래스를 모델링하고 싶습니다. 일반적으로 우리는 같은 내용이지만 다른 이름을 가진 다른 클래스를 작성하고 int
을 double
으로 변경할 수 있습니다. 특히 콘텐츠가 많은 클래스일 때 지루하고 시간이 오래 걸리고 코드가 매력적이지 않게 보일 수 있지만 클래스 템플릿은 유사한 클래스가 필요한 경우 템플릿 역할을 할 클래스를 하나만 작성할 수 있기 때문에 작업을 훨씬 쉽게 만들 수 있습니다. Student
클래스로 그렇게하십시오.#include <iostream>
template<typename S>
class Student{
template<typename T> //this is for the overloading of the << operator
friend std::ostream &operator<<(std::ostream &os, const Student<T> &rhs);
private:
std::string temp;
S data;
public:
Student(std::string t, S d){
temp = t;
data = d;
}
S getdata() const{
return data;
}
std::string getstring() consr{
return temp;
}
};
template<typename S> //another template is needed since the ones above can't be reused
std::ostream &operator<<(std::ostream &os, const Student<S> &rhs){
os << "Name: " << rhs.getstring() << " Data: " << rhs.getdata();
return os;
}
I overloaded the stream insertion
<<
operator so i can outputStudent
objects easierI suggest you read the former article on function templates before this one
클래스의
template<typename S>
속성을 모든 데이터 유형을 모델링하는 데 사용할 템플릿 매개변수 data
을 생성합니다. 따라서 int
을 템플릿 매개변수 S
으로 대체했습니다. Student
과 string
, double
, 다른 데이터 유형을 가질 수 있는 기능, 이제 다음과 같은 float
객체를 생성합니다.int main(){
Student<double> padawan{"Padawan", 3.6};
std::cout << padawan.getdata() << std::endl; //3.6
Student<std::string> erik{"erik", "human"};
std::cout << erik.getdata() << std::endl; //human
Student<Student<int>> casey{"casey", {"glory", 16}};
std::cout << casey.getstring() << std::endl; // casey
std::cout << casey.getdata() << std::endl; // Name: glory Data: 16
//or
std::cout << casey.getdata().getstring() << std::endl; // glory
std::cout << casey.getdata().getdata() << std::endl; // 16
return 0;
}
이제
Student
및 기타 데이터 유형을 모델링할 수 있는 Student
개체를 만드는 것이 얼마나 쉬운지 알 수 있습니다. 두 속성을 템플릿으로 만들 수 있습니다(예: string
및 X temp
). 하지만 템플릿 매개변수에 추가해야 합니다. S data
이므로 컴파일러는 template<typename X, typename S>
이 무엇인지 알 수 있습니다. X
및 다른 string
개체가 포함된 Student 개체를 모델링했습니다. 이 템플릿을 적절하게 활용하면 불필요한 코드를 많이 작성하지 않아도 됩니다. 또한 이러한 Student
개체를 만드는 데 사용한 구문은 친숙해 보일 수 있습니다. Student
과 같은 vector
객체를 생성할 때 벡터도 무대 뒤에서 템플릿 클래스이기 때문에 데크, 맵, 링크 등과 같은 다른 C++ containers도 마찬가지입니다. 그게 다야, 이것은 클래스 템플릿에 대한 기본적인 보기일 뿐이며 상속, 다형성 등을 혼합할 때 매우 복잡해질 수 있습니다. 다음은 IDE에 복사하려는 경우에 대비하여 지금까지 보여드린 소스 코드입니다.#include <iostream>
template<typename S>
class Student{
template<typename T>
friend std::ostream &operator<<(std::ostream &os, const Student<T> &rhs);
private:
std::string temp;
S data;
public:
Student(std::string t, S d) :temp{t}, data{d}{
}
S getdata() const{
return data;
}
std::string getstring() const{
return temp;
}
};
template<typename S>
std::ostream &operator<<(std::ostream &os, const Student<S> &rhs){
os << "Name: " << rhs.getstring() << " Data: " << rhs.getdata();
return os;
}
int main(){
Student<double> padawan{"Padawan", 3.6};
std::cout << padawan.getdata() << std::endl; //3.6
Student<std::string> erik{"erik", "human"};
std::cout << erik.getdata() << std::endl; //human
Student<Student<int>> casey{"casey", {"glory", 16}};
std::cout << casey.getstring() << std::endl; // casey
std::cout << casey.getdata() << std::endl; // Name: glory Data: 16
//or
std::cout << casey.getdata().getstring() << std::endl; // glory
std::cout << casey.getdata().getdata() << std::endl; // 16
return 0;
}
Reference
이 문제에 관하여(C++ 템플릿), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/truepadawan/c-templates-5baj텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)