【发布时间】:2020-07-07 06:45:45
【问题描述】:
假设您编写类似“初始化程序”类的东西,它存储一组值(包括引用)。然后使用这些值初始化给定类型(例如通过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 并且调用 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)>() );
}
【问题讨论】:
-
相关答案:stackoverflow.com/a/38441549/4117728 请注意,它还提到
std::make_form_tuple自 c++17 起可用,看起来您正在构建类似的东西
标签: c++ move-semantics perfect-forwarding stdtuple