Listing 2: run_for_each.
template <class List, class Func> class for_each_type;
template <class List_, class Func_> class for_each_type_
{
static void run_helper_(
Func_ f, void(Func_::*)(typename List_::head*))
{
f((typename List_::head*)0);
for_each_type<typename List_::tail, Func_>::run(f);
}
static void run_helper_(
Func_ f, bool(Func_::*)(typename List_::head*))
{
if (f((typename List_::head*)0))
for_each_type<typename List_::tail, Func_>::run(f);
}
static void run(Func_ f)
{
run_helper_(f, &Func_::operator());
}
friend class for_each_type<List_, Func_>;
};
template <class List, class Func> class for_each_type
{
struct stop
{
static void run(Func) {}
};
typedef select<
boost::is_same<List, null_type>::value, stop,
for_each_type_<List, Func> >::result result_;
public:
static void run(Func f)
{
result_::run(f);
}
};
template <class List, class Func>
void run_for_each(Func f, List* = 0)
{
for_each_type<List, Func>::run(f);
}