2017-01-03 1 views
3

함수 내에서 두 개의 객체를 생성하기 위해 여러 개의 인수를 전달하고 싶습니다. 동일한 방법으로 std::pair<T1, T2>(std::piecewise_construct, ...)이 작동합니다. std :: forward_as_tuple을 사용하여 2 개의 생성자에 인수 전달

그래서 나는 내가

f(std::forward_as_tuple(..., ..., ...), std::forward_as_tuple(..., ...)) 

를 호출 할 수 있습니다하지만 Object0Object1을 구성하는 방법을 모른다

template <typename Args0..., typename Args1...> 
void f(std::tuple<Arg0> args0, std::tuple<Args1> args1) { 
    Object0 alpha(...); 
    Object1 beta(...); 
    ... 
} 

을 썼다. 내가 표준 라이브러리 std::pair에 대한 소스 코드를 확인하고 args0과 args1의 색인을 얻기 위해 복잡한 내부 함수를 사용하는 것 같다. 어떻게하는지에 대한 생각이 있습니까?

답변

3

C++ 17은 이것을 수행하기 위해 make_from_tuple을 가지지 만, 이것을 C++ 11로 작성할 수 있습니다. 여기에 cppreference에서 도난당한 C++ 14 버전이 있습니다 (C++ 11의 경우 std::index_sequence의 구현을 Implementation C++14 make_integer_sequence에서 사용할 수 있음). 이 유틸리티와

namespace detail { 
template <class T, class Tuple, std::size_t... I> 
constexpr T make_from_tuple_impl(Tuple&& t, std::index_sequence<I...>) 
{ 
    return T(std::get<I>(std::forward<Tuple>(t))...); 
} 
} // namespace detail 

template <class T, class Tuple> 
constexpr T make_from_tuple(Tuple&& t) 
{ 
    return detail::make_from_tuple_impl<T>(std::forward<Tuple>(t), 
     std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>{}); 
} 

f의 구현이 바람이다 : 난 그냥 그 튜플과 유형을 추론 권하고 싶습니다,

template <typename... Args0, typename... Args1> 
void f(std::tuple<Args0...> args0, std::tuple<Args1...> args1) { 
    auto alpha = make_from_tuple<Object0>(args0); 
    auto beta = make_from_tuple<Object1>(args1); 
} 

가 더 일반적인 만들려면을 완벽하게 감기 :

template <typename T0, typename T1> 
void f(T0&& args0, T1&& args1) { 
    auto alpha = make_from_tuple<Object0>(std::forward<T0>(args0)); 
    auto beta = make_from_tuple<Object1>(std::forward<T1>(args1)); 
} 

Live C++11 demo

+0

감사합니다. 불행히도, RHEL 7에서 제공하는 gcc 4.8.5와 호환 될 필요가 있습니다. 그래서 저는 C++ 11에서 make_index_sequence를 구현해야한다고 생각합니다. std :: pair에 대한 표준 라이브러리에서 찾은 것입니다. – InsideLoop

+0

@InsideLoop 멋지다. C++ 11에서 작동하는 라이브 데모를 추가했다. – TartanLlama

+0

차가움. 그것은 gcc 4.8.5와 함께 작동합니다 :-) – InsideLoop

관련 문제