Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 가변 함수 템플릿(Variadic Function Templates) 이해하기

개요

C++11부터 도입된 가변 함수 템플릿(Variadic Function Templates)은 개수가 정해져 있지 않은 여러 개의 인자를 하나의 함수로 받을 수 있게 해주는 강력한 기능입니다. 서로 다른 타입의 인자도 함께 전달할 수 있어, 타입 안전성을 유지하면서 printf와 같은 유연한 함수를 직접 구현할 때 특히 유용합니다.

문법

template(typename arg, typename... args)
return_type function_name(arg var1, args... var2)

여기서 typename... args템플릿 매개변수 팩(parameter pack)으로, 0개 이상의 임의의 타입 목록을 나타냅니다. 함수 시그니처의 args... var2함수 매개변수 팩으로, 호출 시 실제로 전달된 값들을 담습니다.

예제 코드

#include <iostream>
using namespace std;

void show() { // 기저 사례(base case): 재귀 종료 조건
    cout << "I am now empty";
}

template <typename T, typename... T2> // 가변 함수 템플릿
void show(T v1, T2... v2) {
    cout << v1 << endl;
    show(v2...); // 남은 인자들로 재귀 호출
}

int main() {
    show(7, 6, 0.04, "hi ", "I am variadic function", "I will show\n");
    return 0;
}

동작 원리

위 코드는 재귀(recursion) 방식으로 동작하며, 두 가지 요소로 구성됩니다.

  • 기저 사례(Base Case): 인자가 하나도 남지 않았을 때 호출되는 일반 함수 show()입니다. 재귀 호출을 멈추는 역할을 합니다.
  • 재귀 단계: 템플릿 버전의 show()는 첫 번째 인자 v1을 출력한 뒤, 나머지 인자 팩 v2...를 펼쳐서(spread) 자기 자신을 다시 호출합니다. 호출될 때마다 인자가 하나씩 줄어들고, 모든 인자가 소진되면 기저 사례에 도달하여 재귀가 종료됩니다.

실행 결과

7
6
0.04
hi I am variadic function
I will show

I am now empty

출력 결과를 보면 int, double, 문자열 등 서로 다른 타입의 인자들이 순서대로 처리되며, 마지막에는 인자 없이 호출된 기저 사례 함수의 메시지가 출력되는 것을 확인할 수 있습니다.