按特定顺序扩展可变模板值的最有效方法是什么?
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) )... );
}
我目前可以做到:
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) )... );
}