template<typename T>
T testFunc(T a) {
return a;
}
형태로
이 있고
c++ 20부터 concept라는 개념이 들어왔는데
template 프로그래밍시 실수를 줄여준다.
template이란 변수의 타입을 정하지않고 필요한 타입을 컴파일시간에 정의해서 사용하는 개념이다.
std::max나 std::vector등도 template을 이용해 만들어져있다.
std::max 사용하는 코드를 보면
#include <algorithm>
using namespace std;
int main() {
int maxI = max<int>(1, 5);
float maxf = max<float>(1.2f, 2.5f);
double maxd = max<double>(1.4, 3.4);
vector<int> ints;
vector<double> doubles;
cout << maxI << endl;
cout << maxf << endl;
cout << maxd << endl;
return 0;
}

최대값이 맞춰 나오는 것을 볼 수 있다.
function overloading을 대체할 때 가장 유용하다
#include <iostream>
int add(int a, int b) {
return a+b;
}
double add(double a, double b) {
return a+b;
}
int main() {
int a = add(1, 1);
double b = add(2.5, 5.1);
}
이런 방식은 타입이 늘어날 때마다 타입만 바뀐 같은 함수를 계속 만들어야하므로 번거롭다.
#include <iostream>
template<typename T>
T add(T a, Tb) {
return a+b;
}
int main() {
int a = add(1, 1);
double b = add(2.5, 5.1);
}
그럴 때 템플릿을 사용하면 간편해진다.
compiler explorer에서 살펴보면

템플릿함수만 생성했을때는 어셈블리에 아무것도 나오지않는다
하지만 타입에 맞는 함수리턴을 선언하면


그에 맞게 컴파일되면서 바이너리나 어셈블리로 만들어진다