假设您编写类似“初始化程序”类的内容,该类存储一组值(包括引用)。然后,这些值将用于初始化给定类型(例如,通过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<...>()
答案 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)
如果存储的值是T
或T&&
类型(假设T
是对象类型),则两个选项都将产生T&&
;如果存储的值是T&
类型,则两个选项都将产生T&
,因此我认为这两个选项之间没有区别。我个人喜欢选项2,因为forward
通常与通用引用一起使用,以将一个函数的参数转发给另一个函数,而在这里,您正在转发存储在类成员中的值,这可能会有些混乱。