我当前可以做到这一点:
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) )... );
}