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



我当前可以做到这一点:

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<>,这样我就不必为任何副本/移动付费?

要避免过多的副本/移动,请使用 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) )... );
}

最新更新