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
복사했습니다!