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

时间:2016-06-16 01:18:26

标签: c++ variadic-templates template-meta-programming

我现在可以这样做:

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<>以便我不必为任何副本/动作付费?

1 个答案:

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