karma( 업 )/C_C++

09. std::tuple( C++11로 가자 )

생짜 2018. 11. 1. 15:37

///////////////////////////////////////////////////////////////

// 09. tuple( std::tuple ) Example

// * C++11에  새롭게 추가, C++11 이전의 컴파일러는 지원을 하지 않음

// * C++11 이전 컴파일러에서는 '-std=c++11' or '-std=gnu++11' 컴파일 옵션을 추가해야 함

// * 가장 일반적인 형태는 함수의 반환값으로 사용

// * 여러개의 반환값을 하나의 tuple로 묶어사용하여 다수의 값 또는 객체를 반환할 수 있다.

///////////////////////////////////////////////////////////////

#include <iostream>

#include <string>

#include <tuple>


std::tuple<double, char, std::string> get_student(int id) //<<-- 리턴값을 tuple로 함

{

    //여러개의 리턴값을 tuple로 만들어 주는 함수( make_tuple )

    if (id == 0) return std::make_tuple(3.8, 'A', "Lisa Simpson"); 

    if (id == 1) return std::make_tuple(2.9, 'C', "Milhouse Van Houten");

    if (id == 2) return std::make_tuple(1.7, 'D', "Ralph Wiggum");

    throw std::invalid_argument("id"); //<<--- 인자값을 검사하는 throw/catch 구문

}


int main()

{

    auto student0 = get_student(0);

    std::cout << "ID: 0, "

               << "GPA: " << std::get<0>(student0) << ", "

               << "grade: " << std::get<1>(student0) << ", "

               << "name: " << std::get<2>(student0) << '\n';


    double gpa1;

    char grade1;

    std::string name1;


    //tuple로 리턴한 값들을  tie 객체를 써서 각각의 변수에 대입

    std::tie(gpa1, grade1, name1) = get_student(1); 

    std::cout << "ID: 1, "

               << "GPA: " << gpa1 << ", "

               << "grade: " << grade1 << ", "

               << "name: " << name1 << '\n';

}


cpp11_tuple.cpp