c++ - 是否可以避免在元组上重复 std::move() ?

标签 c++ c++11 move-semantics rvalue-reference stdtuple

假设我有一个元组和一个函数:

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 是一个左值。那么有没有办法避免为每个 std::get 多次重复 std::move()

最佳答案

您可能想使用 std::integer_sequence

它在 C++14 中可用,但可以用 C++11 实现:https://github.com/serge-sans-paille/pythran/blob/master/pythran/pythonic/include/utils/seq.hpp

多亏了这一点,你需要一个额外的功能,但你避免了这种重复:

void unroll( SomeTuple &t )
{
    someFunction( std::get<0>( std::move( t ) ), std::get<1>( std::move( t ) ) );
}

成为

template<size_t ...I>
void unroll_impl( SomeTuple &t , std::integer_sequence<I...>)
{
    someFunction( std::get<I>( std::move( t ) )...);
}

void unroll( SomeTuple &t )
{
    unroll_impl( t, std::make_index_sequence<2>{});
}

但是你必须为此创建一个辅助函数。

关于c++ - 是否可以避免在元组上重复 std::move() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35070596/

相关文章:

php - C++ 中的 Linux 守护进程处理 PHP 请求

c++ - 为什么我的异常没有被捕获

c++ - 如何简洁、便携、彻底地播种mt19937 PRNG?

c++ - 将 move 语义与 std::pair 或 std::tuple 一起使用

c++ - 派生类析构函数如何在以下程序中被调用为私有(private)的?

c++ - 我是否正确删除了它?

c++ - 添加两个 unsigned char 变量,结果为 int

C++11:将 time_point 增加一秒

c++ - 从被移出的对象 move

c++ - 如何返回没有复制构造函数的对象