C++20부터 함수 파라미터로 auto
를 허용한다.
C++20부터는 template를 이용하여 구현해야 했던걸 auto
를 이용해 구현할 수 있다. 코드를 통해 살펴보자
template<typename T1, typename T2, typename T3>
T1 f(T2 a, T3 b) {
return a + b;
}
int main() {
cout << f<int, int ,int>(1, 1) << endl; // 2
cout << f<string, string, string>("a", "b") << endl; // ab
}
두 타입의 a, b를 더하여 리턴하는 함수를 template를 이용하면 위의 코드처럼 구현할 수 있다. 이 코드에서는 함수를 사용할 때 파라미터들을 어떤 타입으로 사용할지 지정을 하여 사용을 해야 한다. 이 코드를 auto를 이용하면 코드를 더 간결하게 만들 수 있다.
auto f(auto a, auto b) {
return a + b;
}
int main() {
cout << f(1, 1) << endl; // 2
cout << f(string("a"), string("b")) << endl; // ab
}
위의 template 코드와 동일한 기능을 하는 코드다. 코드 양이 매우 줄어들었다. 그러나 template와 같이 어떤 타입인지 지정할 수 없기 때문에 f("a", "b")로 함수를 호출하면 "a"를 char * 타입으로 인식하여 string으로 형 변환을 해줘야 한다.
위의 코드도 template와 마찬가지로 컴파일 타임에 처리를 해주기 때문에 런타임 속도에서 손해는 없지만 컴파일이 오래 걸릴 수 있다.
(이 코드 뭔가 되게 타입 안써있는 파이썬스럽다.. 복잡한 구조를 가지면 읽기 매우 매우 힘들 것 같다)
개인적인 의견
template 없이 함수를 구현하는 것이 코드 양이 매우 짧아지고 구현하는 입장에서 편할 수 있지만 가독성이 떨어진다고 생각한다.
하지만 a+b와 같이 매우 간단한 기능을 가진 함수라면 간단하게 auto를 사용하여 구현하는 것도 좋을 것 같다. 또한 template가 타입을 제한할 수 있기 때문에 더 유용한 경우가 많다고 생각된다.
결론 : 알아서 상황에 맞게 잘 쓰자
'C++' 카테고리의 다른 글
[C/C++] 잡기술 (0) | 2022.07.07 |
---|---|
[C/C++] Sequencing (Sequence Point) (0) | 2022.05.01 |
[C/C++] printf에 float만을 위한 변환 명세가 없는 이유 (0) | 2022.04.28 |
[C++] lower_bound vs upper_bound (0) | 2021.10.15 |
[C++] string split구현 (0) | 2021.09.11 |