C++/STL

[C++17 ] FOLD Expression

sseram 2023. 3. 29. 00:20
반응형

 

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으로 넘어오는 것들을 한번에 쉽게 연산 할 수 있다!

반응형