【发布时间】:2016-01-28 19:43:39
【问题描述】:
假设我有一个元组和一个函数:
typedef std::tuple< std::unqiue_ptr<int>, std::unqiue_ptr<char> > SomeTuple;
void someFunction( std::unqiue_ptr<int>, std::unqiue_ptr<char> );
所以在辅助函数中,我将元组展开为参数:
void unroll( SomeTuple &t )
{
someFunction( std::get<0>( std::move( t ) ), std::get<1>( std::move( t ) ) );
}
它有效,但我想避免多次重复std::move。天真的解决方案,例如:
void unroll( SomeTuple &t )
{
auto &&rt = std::move( t );
someFunction( std::get<0>( rt ), std::get<1>( rt ) );
}
显然不起作用,因为 rt 是lvalue。那么有没有办法避免每个std::get重复std::move()多次?
【问题讨论】:
-
要真正避免重复,请使用众多“爆炸元组”实现中的一种,它可以让您将一个元组“爆炸”成匹配的函数调用的参数。所谓的感谢(AFAIK)关于该主题的祖父演示,The Way of the Exploding Tuple。你所需要的只是可变参数模板,但如果你有 C++14,你可以获得更简单的实现,例如,Exploding Tuple in C++14
标签: c++ c++11 move-semantics rvalue-reference stdtuple