c++ - Apply the same function to each data member - Transform on heterogeneous types sort of thing -
consider following struct:
struct test { char a; short b; int c; long long d; void transformtest() { // pseudo foreach datamember (regardless of type) of test call sometransform(datamember) } }; we pass lambda, function pointer, functor, whatever transformtest(), that's not concern of right now.
what's best way this?
step 1: wrap data in tuple. possibly temporary one.
step 2: wrap callable in functor.
step 3: write tuple_foreach applies functor each element of tuple.
for step 1, i'd advise leaving data is, , using std::tie create tuple of references.
for step 2, simple perfect forwarding functor looks like:
#define returns(x) ->decltype(x) { return (x); } struct foo_functor { template<typename... args> auto operator()(args&&... args) const returns( foo( std::forward<args>(args)... ) ) }; which represents override set of functions called foo, , wraps single object automatically dispatches call appropriate overload of foo.
for step 3, isn't hard. use indexes trick run code on each element of tuple:
void do_in_order() {} template<typename lambda, typename... lambdas> void do_in_order( lambda&& closure, lambdas&&... closures ) { std::forward<lambda>(closure)(); do_in_order( std::forward<lambdas>(closures)... ); } template<unsigned... is> struct seq { typedef seq<is> type; } template<unsigned max, unsigned... is> struct make_seq:make_seq<max-1, max-1, is...> {}; template<unsigned... is> struct make_seq<0,is...>:seq<is...> {}; template<typename tuple, typename functor, unsigned... is> void foreach_tuple_helper( seq<is...>, tuple&& t, functor&& f ) { do_in_order( [&]{ std::forward<functor>(f)(std::get<is>(std::forward<tuple>(t))); }... ); } template<typename tuple, typename functor> void foreach_tuple( tuple&& t, functor&& f ) { foreach_tuple_helper( make_seq<std::tuple_size< typename std::decay<tuple>::type >::value>(), std::forward<tuple>(t), std::forward<functor>(f) ); } do_in_order doesn't work in clang last checked, equivalent indexes trick works on compiler shouldn't hard google.
Comments
Post a Comment