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)
Tuple은 std::tuple일 필요 없고, std::get과 std::tuple_size를 지원하는 모든 것이 될 수 있어요. 특히 std::array와 std::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] |