utility_make_from_tuple

utility_make_from_tuple (튜플로부터 객체 생성)

이 페이지는 C++ 표준 라이브러리의 std::make_from_tuple 함수 템플릿을 다루는 레퍼런스예요. 이 함수는 튜플 t의 요소들을 생성자 인자로 사용하여 T 타입 객체를 생성해요. C++17에서 도입되었고, C++23에서 tuple-like 제약이 적용되었어요.

출처: cppreference

본문

헤더 <tuple>에 정의됨
template < class T , class Tuple > constexpr T make_from_tuple ( Tuple && t ); (C++17부터) (C++23까지)
template < class T , tuple - like Tuple > constexpr T make_from_tuple ( Tuple && t ); (C++23부터)

튜플 t의 요소들을 생성자의 인자로 사용하여 T 타입 객체를 생성해요.

노출 전용 함수 /*make-from-tuple-impl*/가 다음과 같이 정의된다고 가정해요: template < class T , tuple-like Tuple , std :: size_t ... I > // no constraint on Tuple before C++23 constexpr T /*make-from-tuple-impl*/ ( Tuple && t , std :: index_sequence < I ... > ) { return T ( std :: get < I > ( std :: forward < Tuple > ( t ))...); }

효과는 다음 표현식과 동일해요: return /*make-from-tuple-impl*/ < T > ( std :: forward < Tuple > ( t ), std :: make_index_sequence < std :: tuple_size_v < std :: remove_reference_t < Tuple >>> {} );

만약 다음 조건 중 하나라도 해당하면 프로그램은 ill-formed예요:

  • (C++23부터) std::tuple_size_v<std::remove_reference_t<Tuple>>가 1이고 std::reference_constructs_from_temporary_v<T, decltype(std::get<0>(std::declval<Tuple>()))>가 true인 경우, 또는
  • std::is_constructible_v<T, decltype(std::get<I>(std::declval<Tuple>()))...>가 false인 경우.

매개변수 (Parameters)

t - T의 생성자 인자로 사용할 요소들을 가진 튜플

반환값 (Return value)

생성된 T 객체 또는 참조예요.

참고 (Notes)

Tuplestd::tuple일 필요 없고, std::getstd::tuple_size를 지원하는 모든 것이 될 수 있어요. 특히 std::arraystd::pair도 사용할 수 있어요. (C++23까지)
Tuple은 tuple-like로 제약되며, 즉 그 안의 각 타입은 std::tuple의 특수화이거나 tuple-like를 모델링하는 다른 타입(예: std::array, std::pair)이어야 해요. (C++23부터)

보장된 복사 생략(guaranteed copy elision) 덕분에 T는 이동 가능할 필요가 없어요.

기능 테스트 매크로 표준 기능
__cpp_lib_make_from_tuple 201606L (C++17) std::make_from_tuple

예제 (Example)

#include <iostream>
#include <tuple>

struct Foo
{
    Foo(int first, float second, int third)
    {
        std::cout << first << ", " << second << ", " << third << '\n';
    }
};

int main()
{
    auto tuple = std::make_tuple(42, 3.14f, 0);
    std::make_from_tuple<Foo>(std::move(tuple));
}

출력:

42, 3.14, 0

결함 보고 (Defect reports)

DR 적용 표준 공개된 동작 올바른 동작
LWG 3528 C++17 1-튜플의 경우 reinterpret_cast 등을 포함한 캐스트가 허용되었음 금지됨

같이 보기 (See also)

make_tuple (C++11) 인자 타입으로 정의된 타입의 튜플 객체를 생성해요 (함수 템플릿) [edit]
forward_as_tuple (C++11) 전달 참조의 튜플을 생성해요 (함수 템플릿) [edit]
apply (C++17) 튜플 인자로 함수를 호출해요 (함수 템플릿) [edit]

더 알아보기 (Learn more)

cppreference