TIL/TIS 211210

가변 탬플릿

가변 탬플릿을 사용하면 임의의 개수의 인자를 받는 함수를 구현할수 있다. 이때 템플릿 파라미터팩이라는 개념을 이용한다.

template <typename T, typename... Types>
void func1(T arg, Types... args) {
	...
}

탬플릿 파라미터 팩은 0개 이상의 인자들을 나타낸다. -> 위의 함수의 경우 1개의 [탬플릿]인자만 호출하는 경우에도 사용 가능
여러개의 문자열을 합치는 코드(예외처리에 대해서는 생각하지 않는다.)

#include <iostream>

// string클래스에 strCat이라는 맴버 함수를 override
// 임의의 자료형 s를 받아서 string으로 변환
template<typename Str>
std::string strCat(const Str& s) {
    return new std::string(s);
}

// 탬플릿 인자 정의시 : typename...
template<typename Str, typename... Strs>
// 파라미터팩 선언시 : 탬플릿인자...
std::string strCat(const Str& s, Strs... ss) {
	// 파라미터팩 사용 : 변수...
    // strCat(ss...) : 팩 확장이라고 함. 재귀적으로 호출됨.
    return std::string(s) + strCat(ss...);
}

int main() {
    std::cout << strCat(std::string("4"), std::string("2"), std::string("gyeon")) << std::endl;
    /*
     * strCat("4", "2", "gyeon");
     * -> return "4" + strCat("2", "gyeon");
     *                 -> return "2" + strCat("gyeon");
     *                                 -> return "gyeon";
     */
}

파라미터팩의 개수 : sizeof...(파라미터팩) //이때 파라미터팩에는...생략

Fold형식

위까지는 C++ 11에 있는 개념이다.
위처럼 파라미터팩을 사용하기 위해서는 팩확장이라고 하는 재귀적인 코드를 사용해야하는데, 코드의 복잡성이 높아지게 된다. 이를 C++ 17에서는 재귀를 만들 필요 없이 더 간단하게 표현할수 있다.
(Fold방식)형태로 사용.
사용법 및 예시

좋은 웹페이지 즐겨찾기