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

Popular posts from this blog

c++ - CryptStringToBinary API behavior -

java.util.scanner - How to read and add only numbers to array from a text file -

iphone - Three second countdown in cocos2d -