2016-06-16 6 views
2

私は現在、これを行うことができます。variadicテンプレートの値を特定の順序で展開する最も効率的な方法は何ですか?

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

"しかし、これには一時的なstd :: tuple <>を構築する必要があり、そのすべての操作に伴います。" * - コンパイラで最適化を有効にして定量化しましたか? –

+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のコードをc/pにしました... –

関連する問題