2016-06-16 3 views
2

나는 현재이 작업을 수행 할 수 있습니다가변 순서 템플릿의 값을 특정 순서로 확장하는 가장 효율적인 방법은 무엇입니까?

template <std::size_t... Is, class... Ts> 
decltype(auto) custom_expand(std::index_sequence<Is...>, Ts&&... args) 
{ 
    auto tmp_tuple{ std::make_tuple(std::forward<Ts>(args)...) }; 
    return std::make_tuple(std::move(std::get<Is>(tmp_tuple))...); 
} 

이 함수를 호출 ...

custom_expand(std::index_sequence<1, 2, 0>{}, int{ 0 }, char{ 1 }, double{ 2 }); 

... 예상대로 std::tuple<char, double, int>을 반환합니다. 그러나이 작업을 수행하려면 임시 std::tuple<>을 구성해야하며 해당 작업이 수반되어야합니다.

std::tuple<> 임시 보관함을 피할 수있는 방법이있어서 복사/이동 비용을 지불 할 필요가 없습니까?

+0

* "그러나이 임시 표준 : 튜플 <> 및 수반 모든 작업을 구성해야합니다."*는? –

+0

@TonyD 그걸 가져 주셔서 감사합니다. – user2296177

답변

3

초과 복사/이동을 방지하려면 임시로 forward_as_tuple을 사용하십시오. 이는 적절한 튜플을 통해 쉽게 최적화 할 수있는 튜플을 반환합니다. 당신은 최적화 컴파일러에서 사용할 수 있음을 정량화 않았다 -

template <std::size_t... Is, class... Ts> 
auto custom_expand(std::index_sequence<Is...>, Ts&&... args) 
{ 
    auto tmp_tuple = std::forward_as_tuple(std::forward<Ts>(args)...); 
    return std::make_tuple(std::get<Is>(std::move(tmp_tuple))...); 
} 
+0

또는 단지'auto'를 짧게 입력하십시오. – Barry

+0

@Barry Yep, 나는 당신이 상상할 수있는 것처럼 OP의 코드를 보냈다. –