Предположим, вы пишете что-то вроде класса "initializer", в котором хранит набор значений (включая ссылки). Эти значения затем используются для инициализации заданного типа (например, через 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()
для rvalue объекты, которые вызываются при каждом вызове объекта, это 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)>() );
}