我现在可以这样做:
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 :(得分: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) )... );
}