0Pricing
C++ Academy · 강의

가변 템플릿과 매개변수 팩

매개변수 팩과 폴드 표현식으로 가변 템플릿을 작성합니다.

가변 템플릿과 매개변수 팩은(는) CoddyKit의 무료 C++ Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C++ Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

가변 개수의 템플릿 인수

가변 템플릿은 임의의 개수의 템플릿 인수를 받습니다. std::make_unique, std::tuple, printf 스타일의 로그 기록과 같은 함수를 작성할 때 사용됩니다.

매개변수 팩 구문

typename... Ts로 형식 매개변수 팩을 선언하고, Ts...로 확장합니다.

template <typename... Args>
void print_all(Args... args) {
    // ...
}

팩 확장

표현식 뒤의 ...은 팩을 쉼표로 구분된 목록으로 확장합니다.

template <typename... Args>
void pass_through(Args... args) {
    other_func(args...);    // pass each arg
}

재귀적 가변 템플릿 (이전 방식)

C++17 이전에는 가변 함수를 일반적으로 재귀적으로 작성했습니다. 인수 하나를 처리한 다음 나머지 인수로 재귀 호출하는 방식입니다.

// base case
void log() {}

// recursive case
template <typename T, typename... Rest>
void log(T first, Rest... rest) {
    std::cout << first;
    log(rest...);
}

폴드 표현식 (C++17)

C++17에서는 재귀보다 훨씬 깔끔한 폴드 표현식을 추가했습니다. 팩 전체에 연산자를 적용할 수 있습니다.

template <typename... Args>
auto sum(Args... args) {
    return (args + ...);    // fold +
}

std::cout << sum(1, 2, 3, 4);   // 10

폴드 연산자

폴드 형식은 네 가지입니다:

  • (... op pack) — 단항 확장에 대한 왼쪽 폴드
  • (pack op ...) — 오른쪽 폴드
  • (init op ... op pack) — 초기값을 사용하는 왼쪽 폴드
  • (pack op ... op init) — 초기값을 사용하는 오른쪽 폴드

모든 인수 출력

쉼표 폴드와 함께 사용하는 일반적인 관용구입니다.

template <typename... Args>
void print_all(Args... args) {
    ((std::cout << args << " "), ...);   // comma fold
}

print_all(1, "hi", 3.14);   // 1 hi 3.14

인수 개수 세기

sizeof...(pack)은 컴파일 시간에 팩에 포함된 항목 수를 반환합니다.

template <typename... Args>
void info(Args... args) {
    std::cout << "count = " << sizeof...(args);
}

가변 클래스 템플릿

클래스 템플릿에도 매개변수 팩을 지정할 수 있습니다. 예: std::tuple<Ts...>.

template <typename... Ts>
class Tuple {
    // implementation uses recursion or storage tricks
};

팩을 사용한 완벽 전달

가변 템플릿을 std::forward와 결합하면 임의의 인수를 생성자에 완벽하게 전달할 수 있습니다.

template <typename T, typename... Args>
std::unique_ptr<T> my_make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

형식 팩 조작

템플릿 특수화나 폴드 표현식을 사용하면 첫 항목, 마지막 항목, 앞부분과 나머지 부분의 분해 같은 컴파일 시간 목록 연산을 구현할 수 있습니다.

주의 사항

일반적인 문제:

  • 팩 확장을 빠뜨리는 경우(args와 args...의 차이)
  • 폴드 표현식에서 평가 순서가 중요한 경우(결합법칙이 성립하지 않는 연산에서는 왼쪽과 오른쪽이 다릅니다)
  • 깊은 재귀로 인해 컴파일 시간이 늘어나는 경우

빠른 확인

매개변수 팩의 모든 요소를 합산하는 작업을 간소화하는 C++17 기능은 무엇입니까?

요약

가변 템플릿은 매개변수 팩을 통해 가변 개수의 템플릿 인수를 처리합니다. C++17 폴드 표현식은 재귀적인 가변 코드를 간결한 표현식으로 대체합니다. 완벽 전달과 결합하면 팩토리 함수와 범용 디스패치를 구현할 수 있습니다.

자주 묻는 질문

“가변 템플릿과 매개변수 팩” 강의는 무료인가요?

네 — “가변 템플릿과 매개변수 팩” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C++ Academy 강의 전체를 잠금 해제할 수 있습니다. C++ Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“가변 템플릿과 매개변수 팩”에서 뭘 배우나요?

매개변수 팩과 폴드 표현식으로 가변 템플릿을 작성합니다. 브라우저에서 직접 실행하는 실습 코드로 C++ Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

C++ Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 C++ Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“가변 템플릿과 매개변수 팩” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 C++ Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 C++ Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 함수 및 class 템플릿 다시 보기
  2. 템플릿 특수화: 부분 및 전체
  3. 가변 템플릿과 매개변수 팩
  4. constexpr 함수와 if constexpr
← C++ Academy(으)로 돌아가기