Remove link from std :: tuple elements

I implement save / restore functions for some variables using stl tuples as follows:

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; 

This code works well. But instead of explicitly specifying types of set members in

 std::tuple<double, double, int> saved = tupleRef; 

I would rather remove links from all tupleRef members, as in the following

 auto saved = remove_ref_from_tuple_members(tupleRef); 

I believe that for this purpose, you can write the template "remove_ref_from_tuple_members".

Thanks for answers.

+4
source share
2 answers

A simple type alias can be used to apply std::remove_reference to all types in a tuple.

 template <typename... T> using tuple_with_removed_refs = std::tuple<typename std::remove_reference<T>::type...>; 

Armed with this, you can now write a function template:

 template <typename... T> tuple_with_removed_refs remove_ref_from_tuple_members(std::tuple<T...> const& t) { return tuple_with_removed_refs { t }; } 
+5
source

Thanks to R. Martinho Fernandes, whose code I was able to modify for compilation in Visual Studio, where the tuple is hard-coded as a template with 10 types with unused types that are empty structures.

 #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); } 

I also find that binding refs to a tuple, as in

 auto tupleRef = std::make_tuple(std::ref(x_0), ..., std::ref(x_n)); 

can be made less detailed:

 auto tupleRef = std::forward_as_tuple(x_0, ..., x_n); 

but this will not work again in VS, since there is no std :: forward_as_tuple.

0
source

Source: https://habr.com/ru/post/1437962/


All Articles