C++ 일반 함수 제네릭화 질문입니다.
조회수 1138회
void insert (int a, int b[], int index) {
b[index] =a;
}
void insert (char a, char b, int index) {
*(b+index) = a;
}
이 두함수를 일반화한 제네릭 함수로 만드는것이 목표인데, 제네릭이라는 개념을 처음 접해서 이해가 되질 않네요..
저 두 함수를 제네릭화 해주시면 제네릭화된 모습을 비교해보면서 공부해보려고합니다 ㅠㅠ
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
일반화 프로그래밍은 어떤 로직을 작성할 때 특정 타입에 국한되지 않고 다양한 타입에서 동작할 수 있는 코드를 작성하는 것이라고 생각하시면 됩니다.
C++에서는 템플릿 이라는 것을 통해서 일반화 프로그래밍이 가능하며, STL(Standard Template Library) 형태로 표준에서 여러 클래스 및 함수를 제공하고 있습니다.
아래와 같이 여러 종류의
insert()
가 있습니다.void insert(int a, int b[], int index) { b[index] = a; } void insert(char a, char b[], int index) { b[index] = a; } void insert(double a, double b[], int index) { b[index] = a; } void insert(std::string a, std::string b[], int index) { b[index] = a; }
b
의 특정index
에a
값을 넣는 작업을 합니다. 위의 여러 함수는b[index] = a;
와 같은 방식으로 작성하게 될텐데 타입이 다르기 때문에 배열 타입에 따라 모두 오버로딩을 해주어야합니다.함수의 내용은
b[index] = a;
로 모두 동일하나 타입이 다르기 때문에 모두 하나하나 작성해 줘야합니다. 이는 코드가 중복되고 매우 번거롭고 실수를 야기하기 때문에 좋지 못합니다. C++에서는 템플릿을 작성하여 내용은 그대로 유지하되 특정 타입을 치환하는 식으로 동작할 수 있습니다.template<typename T> void insert(T a, T b[], int index) { b[index] = a; } int a1[10] = {}; insert(1, a1, 0); double a2[10] = {}; insert(1.0, a2, 0);
위
insert
함수 템플릿은b[index] = a;
의 내용을 갖지만 호출 시점에서 치환될 대상인T
가 결정됩니다.insert(1, a1, 0);
는a1
정수 배열이기 에T=int
가 되며,insert(1.0, a2, 0);
는a2
가 실수 배열이기에T=double
이 됩니다.처음 코드와 다르게 한번의 템플릿만 작성함으로써 여러 타입에 대응하는 코드를 작성할 수 있습니다.
댓글 입력