按特定顺序扩展可变模板值的最有效方法是什么?

What is the most efficient way to expand a variadic template's values in a specific order?

我目前可以做到:

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 } );

...returns std::tuple<char, double, int> 符合预期。但是,这需要构建一个临时的 std::tuple<> 以及所有该操作所需要的。

有没有办法避免临时 std::tuple<>,这样我就不必为任何 copies/moves 付费?

为避免过多 copies/moves,临时使用 forward_as_tuple。 returns 一个引用元组,可以很容易地被任何体面的优化器优化掉。

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) )... );
}