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

时间:2020-03-26 15:23:12

标签: 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)>() );
    }
};

非常简单的沙发。但是,现在我想为 rvalue 对象提供initialize()的重载,只要调用该对象的对象是 rvalue 且调用{ {1}}是对象被销毁前的最后一个动作。

如何转发元组的值?应该采用哪种选择?

initialize<...>()

2 个答案:

答案 0 :(得分:2)

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

在内部,它的功能类似于:

return T(std::get<I>(std::forward<Tuple>(t))...);

I是类似于原始示例中的索引序列。

答案 1 :(得分:1)

如果存储的值是TT&&类型(假设T是对象类型),则两个选项都将产生T&&;如果存储的值是T&类型,则两个选项都将产生T&,因此我认为这两个选项之间没有区别。我个人喜欢选项2,因为forward通常与通用引用一起使用,以将一个函数的参数转发给另一个函数,而在这里,您正在转发存储在类成员中的值,这可能会有些混乱。

相关问题