https://en.cppreference.com/w/cpp/language/fold
Fold expressions(since C++17) - cppreference.com
Reduces (folds) a parameter pack over a binary operator. [edit] Syntax ( pack op ... ) (1) ( ... op pack ) (2) ( pack op ... op init ) (3) ( init op ... op pack ) (4) 1) unary right fold 2) unary left fold 3) binary right fold 4) binary left fold op - any
en.cppreference.com
이거 활용하기.
c++ 17 이상부터 활용이 가능하다.
template 을 사용하여 variadic template 들을 받다 보면, 이걸 어케하지..? 싶을 때가 있더라.
bing 에게 물어보고, 열심히 삽질하며 찾아보았다.
#include <iostream>
using namespace std;
template <typename ... Types>
auto doSome(Types ... args) {
tuple<Types ...> res = make_tuple(args ...);
// TODO : res 를 한 번씩 출력한다!
return res;
}
int main() {
auto res1 = doSome(1, 2, 44, "aa");
auto res2 = doSome(1.3, string("hiho"), "tt");
return 0;
}
이런 코드가 있다.
doSome 함수는 여러 variadic template 을 받아, 그것을 tuple로 만들어주고 출력 한 다음 tuple을 return 해 준다.
여기서 tuple을 어케 출력하지..? 를 가만히 생각해보면.. 마땅히 떠오르지가 않는다.
인자 개수도 중구난방이고, 거기에 무슨 타입이 들어가 있는지도 모르니까.
이 때, 위에 써 있는 fold를 이용한다.
fold expression에 대한 설명을 살펴보면

이런 식으로 설명이 잘 나와있다.
template<typename... Args>
int add(Args... args) { return (... + args); }
int sumall = add(1, 2, 3, 4, 5);
참고해서 함수를 한 번 만들어 보았다.
저 위의 설명에서 두 번째 타입이다.
위의 설명에 따라 add 함수를 해체해 보면
int add (/**/) { return ((((1+2) + 3) + 4) + 5); }
가 된다!
이런 식으로 op와 어느 식으로 계산할 건지 지정해주면 된다.
그리고 우리가 사용할 수 있는 op는

굉장히 많다!
여기서 ',' 를 사용해 보도록 하자.
왼쪽에 먼저 arg를 하나 출력해주고, op를 ',' 로 사용한 다음, 그 다음 pack 된 것들을 넣는다.
#include <iostream>
using namespace std;
template <typename ... Types>
auto doSome(Types ... args) {
tuple<Types ...> res = make_tuple(args ...);
((cout << args << " "), ...);
return res;
}
int main() {
auto res2 = doSome(1.3, string("hiho"), "tt");
return 0;
}
이런 식으로.
이렇게 하고 출력하면

위 표현식을 활용하여서 variadic template으로 넘어오는 것들을 한번에 쉽게 연산 할 수 있다!
'C++ > STL' 카테고리의 다른 글
[C++] std::async, std::thread (1) (0) | 2023.04.09 |
---|---|
[C++17] std::filesystem::path (0) | 2023.04.04 |
[C++ String] raw String (0) | 2023.02.27 |
[C++ Container] map/unordered_map. at, []. element access 차이 (0) | 2023.02.24 |
[C++ Container] vector push_back vs emplace_back (0) | 2023.02.22 |