010
13.03.2010, 23:58 Uhr
0xdeadbeef
Gott (Operator)
|
Naja, speziell das ließe sich jetzt aber auch einfacher lösen. Beispielsweise
C++: |
//////////////////////////////////////////////////////////////////////////////////////////////////// #include <cstddef> #include <iostream> #include <tuple> #include <utility>
template<typename tuple_t, std::size_t pos> struct tuple_for_each_aux { template<typename func_t> static void run(tuple_t t, func_t const &func) { tuple_for_each_aux<tuple_t, pos - 1>::run(t, func); func(std::get<pos - 1>(t)); } }; template<typename tuple_t> struct tuple_for_each_aux<tuple_t, 0> { template<typename func_t> static void run(tuple_t t, func_t const &func) { } };
template<typename func_t, template<typename...> class tuple_template, typename... T> void tuple_for_each(tuple_template<T...> const &t, func_t const &func) { tuple_for_each_aux<tuple_template<T...> const &, sizeof...(T)>::run(t, func); }
template<typename func_t, template<typename ...> class tuple_template, typename... T> void tuple_for_each(tuple_template<T...> &t, func_t const &func) { tuple_for_each_aux<tuple_template<T...> &, sizeof...(T)>::run(t, func); }
struct test_func { template<typename T> void operator()(T const &t) const { std::cout << t << std::endl; }
template<typename T> void operator()(T &t) const { std::cout << t << std::endl; t *= 2; } };
int main() { std::tuple<int, long, double> t(1, 2l, 3.141); tuple_for_each(t, test_func()); std::tuple<int, long, double> const t2 = t; tuple_for_each(t2, test_func()); tuple_for_each(t2, test_func()); }
|
...und auch das ist eigentlich nur so viel, um const und non-const behandeln zu können. Memberfunktionen kann man auf die Art ggf. über std::mem_fun abhandeln. -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 13.03.2010 um 23:59 Uhr von 0xdeadbeef editiert. |