C++ Tuple로 여러 결과 반환하기

Created Date: Last Updated:

함수에서 결과 두 개를 반환해야 할 때가 있다. 결과를 받을 변수를 참조로 넘기는 방법도 있지만, std::tuple로 묶으면 간결하게 쓸 수 있다.

짝수 여부와 짝수일 때 1을 더한 값을 함께 반환하는 예제를 적어 두었다.

#include <iostream>
#include <tuple>

std::tuple<bool,int> isEvenAdd(int val) {
    bool bis_even = (val % 2 == 0);
    int ret = val;
    if (bis_even) {
        ret = val+1;
    }
    return std::make_tuple(bis_even, ret);
}

int main()
{
    auto ret = isEvenAdd(10);
    std::cout << "ret contains: ";
    std::cout << std::get<0>(ret) << ' ';
    std::cout << std::get<1>(ret) << '\n';
    
    std::tie (myResult, myValue) = ret;
    std::cout << "tie contains: ";
    std::cout << myResult << ' ';
    std::cout << myValue << '\n';
    
    auto [bis_even, val] = isEvenAdd(11);
    std::cout << "auto tie contains: ";
    std::cout << bis_even << ' ';
    std::cout << val << '\n';
}

std::get<index>(instance)로 각 원소에 접근한다. std::tie로 여러 값을 한 번에 풀어 받을 수도 있다.

마지막 auto [bis_even, val] 형태는 C++17의 구조적 바인딩이다. tuple 자체는 C++11부터 사용할 수 있지만 이 부분은 버전이 다르다.

원문 예제의 myResult, myValue는 사용하는 곳에서 따로 선언해야 한다.