Я реализую функцию сохранения / восстановления для некоторых переменных с помощью кортежей stl следующим образом:
double a = 1, b = 2;
int c = 3;
auto tupleRef = std::make_tuple(std::ref(a), std::ref(b), std::ref(c));
// here I'm saving current state of a, b, c
std::tuple<double, double, int> saved = tupleRef;
//here goes block of code, where a, b, and c get spoiled
......................
//
//now I'm restoring initial state of a, b, c
tupleRef = savedTuple;
Этот код работает хорошо. Но вместо явного указания типов членов кортежа в
std::tuple<double, double, int> saved = tupleRef;
Я бы хотел удалить ссылки со всех членов tupleRef, как в следующем
auto saved = remove_ref_from_tuple_members(tupleRef);
Я считаю, что можно написать шаблон «remove_ref_from_tuple_members» для этой цели.
Спасибо за ответы.
Псевдоним простого типа может быть использован для применения std::remove_reference
для всех типов в кортеже.
template <typename... T>
using tuple_with_removed_refs = std::tuple<typename std::remove_reference<T>::type...>;
Вооружившись этим, теперь вы можете написать шаблон функции:
template <typename... T>
tuple_with_removed_refs remove_ref_from_tuple_members(std::tuple<T...> const& t) {
return tuple_with_removed_refs { t };
}
Спасибо R. Martinho Fernandes, чей код я смог изменить для компиляции в Visual Studio, где кортеж жестко запрограммирован как шаблон с 10 типами, а неиспользуемые типы являются пустыми структурами.
#define _RR_(x) typename std::remove_reference<x>::type
#define _no_ref_tuple_ std::tuple<_RR_(T0), _RR_(T1), _RR_(T2), _RR_(T3), _RR_(T4), _RR_(T5), _RR_(T6), _RR_(T7), _RR_(T8), _RR_(T9)>
template <typename T0, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9>
_no_ref_tuple_ map_remove_ref(std::tuple<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> const& t)
{
return _no_ref_tuple_(t);
}
Я также думаю, что привязка ссылок в кортеж, как в
auto tupleRef = std::make_tuple(std::ref(x_0), ..., std::ref(x_n));
можно сделать менее многословным:
auto tupleRef = std::forward_as_tuple(x_0, ..., x_n);
но это опять не будет работать в VS, так как нет std :: forward_as_tuple.