c++ - 如何转发元组的值? std::get(move(tuple))vs.forward(std::get(tuple))

标签 c++ move-semantics perfect-forwarding stdtuple

假设您编写了类似“初始化程序”类的内容,其中存储了一组值(包括引用)。然后将这些值用于来初始化给定类型(例如,通过my_initializer.initialize<Foo>():

template<typename... Values>
struct Initializer{
    std::tuple<Values...> values;

    template<typename TypeToInitialize, std::size_t... Is>
    TypeToInitialize initialize_implementation( std::index_sequence<Is...> ){
        return { std::get<Is>( this->values )... };
    }

    template<typename TypeToInitialize>
    TypeToInitialize initialize(){
        return initialize_implementation( std::make_index_sequence<sizeof...(Values)>() );
    }
};

非常简单的沙发。但是,现在我想为右值对象提供initialize()的重载,只要在调用该对象的对象为右值时调用该对象,并且对initialize<...>()的调用是销毁该对象之前的最后操作。

如何转发元组的值? 我应该选择哪个选项?
template<typename TypeToInitialize, std::size_t... Is>
TypeToInitialize initialize_move_implementation( std::index_sequence<Is...> )
{
    // OPTION 1
    return { std::forward<Values>( std::get<Is>( this->values ) )... };

    // OPTION 2
    return { std::get<Is>( std::move( this->values ) )... };
}

template<typename TypeToInitialize>
TypeToInitialize initialize() && {
    return initialize_move_implementation<TypeToInitialize>( std::make_index_sequence<sizeof...(Values)>() );
}

最佳答案

template<typename TypeToInitialize>
TypeToInitialize initialize() && {
    return std::make_from_tuple<TypeToInitialize>(this->values);
}

在内部,它执行以下操作:
return T(std::get<I>(std::forward<Tuple>(t))...);

像您的原始示例一样,I是一个索引序列。

关于c++ - 如何转发元组的值? std::get(move(tuple))vs.forward(std::get(tuple)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60870576/

相关文章:

c++ - 为什么 T const&& 不是转发引用?

c++ - 我们应该如何实现对象类型的 move ?

c++ - std::forward() 的右值引用重载的目的是什么?

c++ - 有没有一种方法可以禁用临时对象参数的功能?

c++ - Mac OS X 上的 PostThreadMessage 等效项

c++ - 减少模板策略困惑

c++ - 为什么 std::map 的 move 构造函数不是 noexcept?

c++ - 使用 RPC 或其他方式

c++ - 即使边界键不存在,我也可以迭代 std::map 键范围吗?

c++ - 完美转发到作为参数接收的 lambda